クリップボードが更新された時のイベントを取得する
|
クリップボードが更新された時、いろいろしたいことがあると思います。
少々ややこしいですが以下のようにすれば
クリップボードの更新を監視する事が出来ます。
そうするとクリップボード履歴機能を持つソフトが作れますね。
Formのメンバーに以下のように定義します
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FClipNextHandle: HWND;
procedure WMDrawClipboard(var Msg: TWMDrawClipboard);
message WM_DRAWCLIPBOARD;
procedure WMChangeCBChain(var Msg: TWMChangeCBChain);
message WM_CHANGECBCHAIN;
public
end;
↑適当に省略しています
implimention部に以下のように実装します。
procedure TForm1.WMDrawClipboard(var Msg: TWMDrawClipboard);
//クリップボード更新フック
//更新された後に流れてくる。
//アプリが立ち上がった瞬間も流れる
begin
inherited;
//------------------------------
{ここにテキストバックアップ処理等を行えば。
クリップボード履歴機能が実装できます。}
ShowMessage('クリップボード更新されたよ');
//------------------------------
if FClipNextHandle<>0 then
SendMessage(FClipNextHandle,WM_DRAWCLIPBOARD, 0, 0);
end;
procedure TForm1.WMChangeCBChain(var Msg: TWMChangeCBChain);
begin
if Msg.Remove = FClipNextHandle then
FClipNextHandle := Msg.Next;
if FClipNextHandle <> 0 then
SendMessage(FClipNextHandle, WM_CHANGECBCHAIN, Msg.Remove,Msg.Next);
end;
procedure TForm1.FormCreate(Sender: TObject);
procedure ClipboardSetHandle;//クリップボード履歴の為に必要な初期化
begin
FClipNextHandle := SetClipboardViewer(Form1.Handle);
if FClipNextHandle = 0 then
if GetLastError <> 0 then {本当にエラーだったら}
ShowMessage('なぜかクリップボードのフックに失敗しました(T_T)');
end;
begin
ClipboardSetHandle;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ChangeClipboardChain(Handle, FClipNextHandle);
//クリップボード監視処理の破棄
end;
|
|