【VBA×WindowsAPI】GetClipboardData関数の使い方
GetClipboardData関数
GetClipboardData関数は指定した形式でクリップボードからデータを取得する関数です。
たとえばクリップボード内にテキストデータが格納されている場合に、この関数でテキストデータ形式(CF_TEXT)を指示すると、クリップボード内のテキストデータへのハンドルを取得することができます。このハンドルをメモリを操作する系の関数(GlobalAlloc関数やMoveMemory関数など)に渡すことでデータの情報を抜き出すことが可能になります。
クリップボード内に格納されているデータと違う形式を指定した場合はデータへのハンドルは取得できないため、予めクリップボード内に何のデータがあるのかを判定しておく必要があります。
GetClipboardData関数をはじめとしたクリップボードの操作する関数を使用するには事前にOpenClipboard関数を実行してクリップボードを開いておく(アクセスを可能にしておく)必要があります。また、クリップボードの操作が終了した際は必ずCloseClipboard関数を使ってクリップボードを閉じる必要があります。(※他のアプリケーションがクリップボードにアクセスできないままになります)
クリップボード関連の関数としては下記のような様々な関数が存在しています。
関数名 | 内容 |
OpenClipboard関数 | クリップボードを開く |
CloseClipboard関数 | クリップボードを閉じる |
EmptyClipboard関数 | クリップボード内のデータを空にする |
GetClipboardData関数 | クリップボード内のデータを取得する |
SetClipboardData関数 | クリップボード内にデータをセットにする |
IsClipboardFormatAvailable関数 | クリップボード内のデータのフォーマットを調べる |
実際にクリップボードとデータのやり取りをするコードを書く際は、これら関数だけでなくメモリを操作する系の関数(GlobalAlloc関数やMoveMemory関数など)と合わせて利用されることが多いです。
使用方法
GetClipboardData関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function GetClipboardData Lib “user32” _
(ByVal wFormat As Long) As LongPtr
Declare Function GetClipboardData Lib “user32” _
(ByVal wFormat As Long) As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
1 2 3 4 5 |
#If VBA7 Then Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr #Else Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long #End If |
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
GetClipboardData関数の構文は下記のように書きます。
hMem = GetClipboardData(wFormat)
引数
wFormat (Long型)
任意のクリップボード形式(フォーマット)を入力します。
ここで指定した形式と同じデータがクリップボード内に存在する場合にそのデータへのハンドルが取得できます。反対に指定した形式のデータがクリップボード内に存在しない場合は関数が失敗します。
データ形式は指定の定数値を入力します。下表はVBAにて主に利用されるものです。
その他のクリップボード形式は「標準クリップボード形式」を参照下さい。
定数値 | 説明 |
Const CF_TEXT = 1 | テキストデータ (文字列全般) |
Const CF_BITMAP = 2 | ビットマップ画像データ (画像全般) |
Const CF_HDROP = 15 | ファイルデータ |
クリップボード形式は特定の形式間で暗黙的なデータ形式変換が行われるものもあります。
たとえばPNG画像やGIF画像がクリップボード内にある場合、ビットマップ画像データではないですが「CF_BITMAP」を指定することでデータの取得が可能になります。
暗黙的なデータ形式変換については「合成されたクリップボード形式」を参照下さい。
戻り値
hMem (64bit:LongPtr型 / 32bit:Long型)
戻り値は関数が成功した場合はクリップボード内に格納されているデータへのハンドルです。
関数が失敗した場合はNULL値(0)が返されます。
サンプルコード
以下はGetClipboardData関数とOpenClipboard関数、CloseClipboard関数を使って、クリップボード内のテキストデータへのハンドルを取得するサンプルコードです。
下記コードのGetClipboardData関数の引数を変更することで画像データやファイルデータへのハンドルに変更することもできます。エクスプローラやデスクトップ上で画像”ファイル”をコピーしても文字通りファイルデータ扱いとなるため、画像データで確認する場合はブラウザ上の画像やExcel上の画像を直接コピーする必要があるので注意して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Option Explicit Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr Const CF_TEXT = 1 'テキストデータ Const CF_BITMAP = 2 '画像データ Const CF_HDROP = 15 'ファイルデータ Sub main() Dim hMem As LongPtr 'クリップボードを開く If OpenClipboard(0) <> 0 Then 'クリップボード内のテキストデータへのハンドルを取得 hMem = GetClipboardData(CF_TEXT) '取得したハンドルをイミディエイトウィンドウに出力 If hMem <> 0 Then Debug.Print "hMem : " & Hex(hMem) Else Debug.Print "データの取得に失敗しました" End If 'クリップボードを閉じる Call CloseClipboard End If End Sub |
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:GetClipboardData 関数 (winuser.h) – Win32 apps