クリップボードは、Windowsでも利用頻度が高い機能の1つだろう。そもそもGUIシステムとクリップボードは切っても切れない関係にある。クリップボードは、基本的にはコピーや切り取りを実行するアプリケーションがデータを登録する。このときアプリケーションは、同一内容のデータを複数の形式で保存できる。できるだけ多くの形式で登録することが推奨されているが、何を登録するのかはアプリケーション次第である。貼り付けを実行するプログラムは、登録されたデータから適当と思われるものを取り出す。
結局のところ、クリップボードとは、アプリケーションから見ればWindowsが用意した機能をAPIを介して利用することだ。また、Windowsなどが用意するGUI部品の中には、コピーやペーストに対応しているものもあり、アプリケーションがその動作を禁止しない限り有効になることもある。こうした場合、アプリケーションは何もしなくてよい。
PowerShellでクリップボードを扱う
基本的にはGUIで使うクリップボードだが、コマンドラインからの操作もできる。cmd.exeにはclip.exe、PowerShellには「Set-Clipboard」「Get-Clipboard」というコマンドが用意されている。clip.exeは、クリップボードへの登録しかできないが、PowerShellだと、クリップボードデータの取り出しも可能だ。
それぞれ、以下に解説がある。
●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()
いくつかの形式は、利用頻度が高いため、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")の場合には、上記のコマンドを使うと、ビットマップオブジェクトのプロパティが表示される。
これは、以下のようにすることで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」オブジェクトが出力されていることがわかる。
この場合には、「ToArray()」メソッドで1回、バイト配列に変換することでデータを取り込むことが可能だ。たとえば、
[System.Windows.Clipboard]::GetDataObject().GetData("DataInterchangeFormat").ToArray() | Format-Hex
とすれば、16進数でダンプできる。
スクリプトやコマンドなどを併用することで、クリップボードの中身を変換――たとえば日付の書式を変える――して再度クリップボードに書き戻すことが可能だ。
手作業では面倒だが、スクリプトを使えば簡単な変換処理は結構ある。このとき、スクリプトへの入力と出力にクリップボードを使うとGUIプログラムの間をスクリプトで補完することが可能になる。
この連載の記事
-
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 -
第447回
PC
この秋登場のWindows 11の新バージョン、Ver.24H2の状況を見る -
第446回
PC
Windows 11のフォトアプリがUWPからWin32アプリになったことで今更わかるUWPの問題点 -
第445回
PC
次期Windows 11ではAndroidのファイルをエクスプローラーからアクセス可能になる - この連載の一覧へ