1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自作クリップボード監視クラスTClipboardWatcher の使い方

Posted at

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 お願いします! ✨

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?