このページの本文へ

Windows Info 第335回

Windowsの基本機能 クリップボードをさらに活用する

2022年07月10日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 クリップボードは、Windowsでも利用頻度が高い機能の1つだろう。そもそもGUIシステムとクリップボードは切っても切れない関係にある。クリップボードは、基本的にはコピーや切り取りを実行するアプリケーションがデータを登録する。このときアプリケーションは、同一内容のデータを複数の形式で保存できる。できるだけ多くの形式で登録することが推奨されているが、何を登録するのかはアプリケーション次第である。貼り付けを実行するプログラムは、登録されたデータから適当と思われるものを取り出す。

 結局のところ、クリップボードとは、アプリケーションから見ればWindowsが用意した機能をAPIを介して利用することだ。また、Windowsなどが用意するGUI部品の中には、コピーやペーストに対応しているものもあり、アプリケーションがその動作を禁止しない限り有効になることもある。こうした場合、アプリケーションは何もしなくてよい。

PowerShellでクリップボードを扱う

 基本的にはGUIで使うクリップボードだが、コマンドラインからの操作もできる。cmd.exeにはclip.exe、PowerShellには「Set-Clipboard」「Get-Clipboard」というコマンドが用意されている。clip.exeは、クリップボードへの登録しかできないが、PowerShellだと、クリップボードデータの取り出しも可能だ。

PowerShellでGet-Clipboardコマンドを使えば、クリップボードの内容を取り出すことができる

 それぞれ、以下に解説がある。

●Get-Clipboard
 https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/get-clipboard?view=powershell-5.1

●Set-Clipboard
 https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/set-clipboard?view=powershell-5.1

 PowerShellでGet-Clipboardを使う場合、画像や音声データも取り出すことができる。ただしテキスト以外は、PowerShellでは直接扱うことは不可能。そこで画像データであれば以下のようにして、ファイルに保存すれば利用できるようになる。

(Get-Clipboard -Format Image).Save("c:\Temp\test.png")

クリップボードをさらに活用する

 アプリケーションはデータをコピーするとき、可能な限り多くのデータ形式をクリップボードに登録することが推奨されていると書いた。つまり、クリップボードには複数のデータ形式が同時に登録できることを意味する。PowerShellにはクリップボードを扱うコマンドがあるが、前述のように機能が限定されている。なので、直接.NET Frameworkを使う。

 .NET Frameworkでのクリップボード機能(Clipboardクラス)は、Win32APIとほぼ同等だが、簡略化されている。たとえば、Win32APIでは、クリップボードが変化したときにイベント処理ができるが、.NET Frameworkではこうした機能はカバーされていない。

 ClipboardクラスをWindows PowerShellから使うには、準備として以下のコマンドを実行する。

Add-Type -AssemblyName PresentationFramework

 上記のコマンドは、Windows PowerShell起動後に1回だけ実行すればよい。では、Excelでセル範囲をコピーしたとき、どのようなデータが出てくるのかを調べて見る。Excelが登録したデータ形式は、以下のコマンドで調べることができる。

[System.Windows.Clipboard]::GetDataObject().GetFormats()

Excelはセル範囲のコピーで25種類のデータ形式をクリップボードに登録している。ただし、Excelのバージョンより違いが出る可能性がある

 いくつかの形式は、利用頻度が高いため、Windowsでは標準的なものとして登録されている。これについては、以下に記述がある。

●DataFormats クラス
 https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.dataformats?view=netframework-4.8

 Excelは、24種のデータ形式を登録している。

 この表では、各形式を「テキスト」「メディアデータ(画像、音声)」「バイナリデータ」に分類している。Excelのセル範囲のコピーなのに「画像」は変に思うかもしれない。しかし、貼り付けするアプリケーションは、たとえば、ペイント(mspaint.exe)かもしれない。

 データ形式を確認するだけなら、フォーマット名には、上記のコマンドで表示されたものを使う。たとえばテキスト(Text)データなら

[System.Windows.Clipboard]::GetDataObject().GetData("Text")

とすればよい。

 指定したフォーマットにより、読み出し方にはいろいろと違いがある。画像データ("System.Drawing.Bitmap")の場合には、上記のコマンドを使うと、ビットマップオブジェクトのプロパティが表示される。

System.Drawing.BitmapオブジェクトならSaveメソッドが使えるのでファイルとして保存すれば表示できる

 これは、以下のようにすることでGIFファイルに保存できる。

[System.Windows.Clipboard]::GetDataObject().GetData("System.Drawing.Bitmap").Save("c:\temp\excel.gif")

 表示や保存などはフォーマットごとに違う。どんなオブジェクトが出力されたのかは、Get-Memberコマンドで調べることができる。たとえば、Excelの"DataInterchangeFormat"形式の場合、

[System.Windows.Clipboard]::GetDataObject().GetData("DataInterchangeFormat") | get-member

とすると、「System.IO.MemoryStream」オブジェクトが出力されていることがわかる。

出力されるデータ形式が「System.IO.MemoryStream」の場合、ToArray()メソッドを使ってバイト配列に変換する

 この場合には、「ToArray()」メソッドで1回、バイト配列に変換することでデータを取り込むことが可能だ。たとえば、

[System.Windows.Clipboard]::GetDataObject().GetData("DataInterchangeFormat").ToArray() | Format-Hex

とすれば、16進数でダンプできる。

バイト配列に変換したら、たとえばFormat-Hexコマンドを使って16進数ダンプにできる

 スクリプトやコマンドなどを併用することで、クリップボードの中身を変換――たとえば日付の書式を変える――して再度クリップボードに書き戻すことが可能だ。

「2022年」というテキストがクリップボードに入っているとき、これを読み出して書式を変更して、クリップボードに書き戻すことができる。この処理はコマンドラインだが、クリップボード経由なので、GUIアプリケーションからデータを受け取り、GUIアプリケーションに渡すことが可能だ

 手作業では面倒だが、スクリプトを使えば簡単な変換処理は結構ある。このとき、スクリプトへの入力と出力にクリップボードを使うとGUIプログラムの間をスクリプトで補完することが可能になる。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン