Delphiでクリップボードの変化を自動監視する【TClipboardWatcherクラス】
概要
TClipboardWatcher
は、Delphi VCL アプリケーションで クリップボードの変化を自動検出し、テキスト・ビットマップ・PNG データを即座に取得できる便利なコンポーネントです。
- ✅
WM_CLIPBOARDUPDATE
によるポーリング不要の監視 - ✅ テキスト・ビットマップ・PNG 形式に対応
- ✅
OnChange
イベントで変化を通知 - ✅ PNGは Windows 標準外だが独自対応
- ✅ デバウンス処理で不要な連続通知を防止
特徴
クリップボードに変化があるとイベントで通知
クリップボードの内容は安全にクラス内のフィールドに格納済み
複数の形式が同時に送られて来ても発生するイベントは1回のみ
透明化情報を持った画像データはPNG形式で保存(送信側アプリによる)
クリップボードにテキストや画像を読み書きするグローバル関数を用意
データ形式 | 自動取得 | 備考 |
---|---|---|
テキスト | ◯ |
Clipboard.AsText 相当 |
BMP画像 | ◯ |
TBitmap で受け取れる |
PNG画像 | ◯ |
TPngImage で受け取れる(独自対応) |
主な使い方
var
Watcher: TClipboardWatcher;
begin
Watcher := TClipboardWatcher.Create;
Watcher.OnChange := YourWatcherOnChange;
Watcher.Enabled := True;
end;
OnChange
イベントでは、変更後に取得できたデータ形式を TClipboardWatcherDataTypes
セットで通知してくれます。
procedure TForm1.YourWatcherOnChange(Sender: TObject;
const DataTypes: TClipboardWatcherDataTypes);
begin
if cdtText in DataTypes then
ShowMessage((Sender as TClipboardWatcher).Text);
end;
補足:デバウンス処理あり
大量にクリップボードへ書き込むアプリ(例:画像加工ツール)に対しても、500msのデバウンスにより無駄な連続通知を防止しています。
📋 便利な補助関数(クリップボード操作用のグローバル関数)
以下は ClipboardWatcher.pas
に定義されている、汎用的に利用できるクリップボード操作用のグローバル関数です。フォームやコンポーネントに依存せず、任意のタイミングで使用できます。
🔹 procedure SetClipboardText(const Text: string);
指定された文字列 Text
をクリップボードにコピーします。内部では ClipboardUpdateIsSelf := True
が設定されており、自身によるクリップボード更新であることを通知します。
- 使用例:
SetClipboardText('Hello, world!');
- 登録形式:
CF_UNICODETEXT
🔹 procedure SetClipboardBitmap(Bmp: TBitmap);
TBitmap
をクリップボードにコピーします。以下の3形式で同時に登録されるため、他アプリとの高い互換性を持ちます:
-
CF_BITMAP
(GDI互換) -
CF_DIB
(24bit RGB データ) -
CF_PNG
(PNGストリーム) -
使用例:
SetClipboardBitmap(MyBitmap);
🔹 procedure SetClipboardPng(Png: TPngImage);
TPngImage
をもとに、内部で TBitmap
に変換したうえで SetClipboardBitmap
と同等の形式で登録します。
- 使用例:
SetClipboardPng(MyPng);
🔹 function GetClipboardBitmap(Bitmap: TBitmap): Boolean;
クリップボードから CF_BITMAP
を読み込み、指定された TBitmap
に代入します。取得に成功した場合は True
を返します。
- 使用例:
if GetClipboardBitmap(MyBitmap) then Image1.Picture.Assign(MyBitmap);
🔹 function GetClipboardPng(Png: TPngImage): Boolean;
CF_PNG
形式でクリップボードに格納された PNG を TPngImage
に読み込みます。PNGは独自形式のため、登録と取得には RegisterClipboardFormat('PNG')
が必要です。
- 使用例:
if GetClipboardPng(MyPng) then MyPng.SaveToFile('from_clipboard.png');
🔹 function GetClipboardText(var Text: string): Boolean;
クリップボードに存在する Unicode テキスト(CF_UNICODETEXT
)を取得し、Text
に代入します。成功すれば True
を返します。
- 使用例:
var txt: string; if GetClipboardText(txt) then ShowMessage(txt);
注意点
- PNG形式は
RegisterClipboardFormat('PNG')
を使用して明示的に対応。 -
SafeOpenClipboard
による排他制御がなされており、安定して動作します。 - フォームに貼り付けるコンポーネントではなく、コードでインスタンス化して使用します。
対象環境
- Delphi 10 以降(VCL)
- Windows 10 / 11
ソースコード
GitHub にて公開中:
まとめ
クリップボードの中身が変わったタイミングで即座に処理をしたいときに、TClipboardWatcher
は非常に有用です。定期ポーリングよりもスマートで、しかも PNG にも対応済み。
ぜひ自作ツールや監視系ユーティリティに組み込んでみてください。
この記事が役に立ったら LGTM お願いします! ✨