|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"クリップボード監視コンポーネント"
こんにちは、ぜえた です。
クリップボードの内容変更を監視するコンポーネントです。クリップボー
ドビューアやクリップボード履歴に使えます。
クリップボードの内容が変更されたとき OnChangeイベントが起こります。
Enabledが Falseから Trueになったときなどにも OnChangeイベントが起
こるので注意してください。
unit CBWatch;
interface
uses
Windows, Messages, Classes, Forms;
type
TClipboardWatcher = class(TComponent)
private
FWindowHandle: HWND;
FNextWindowHandle: HWND;
FOnChange: TNotifyEvent;
FEnabled: Boolean;
FRegistered: Boolean;
procedure Update;
procedure SetEnabled(Value: Boolean);
procedure SetOnChange(Value: TNotifyEvent);
procedure WndProc(var Message: TMessage);
protected
procedure ClipboardChanged; dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Enabled: Boolean read FEnabled write SetEnabled default True;
property OnChange: TNotifyEvent read FOnChange write SetOnChange;
end;
procedure Register;
implementation
{ TClipboardWatcher }
constructor TClipboardWatcher.Create(AOwner: TComponent); //override;
begin
inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
FEnabled := True;
end;
destructor TClipboardWatcher.Destroy; //override;
begin
SetEnabled(False);
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;
procedure TClipboardWatcher.Update;
begin
if FRegistered = FEnabled and Assigned(FOnChange) then Exit;
FRegistered := not FRegistered;
if FRegistered then
FNextWindowHandle := SetClipboardViewer(FWindowHandle)
else
ChangeClipboardChain(FWindowHandle, FNextWindowHandle);
end;
procedure TClipboardWatcher.SetEnabled(Value: Boolean);
begin
FEnabled := Value;
Update;
end;
procedure TClipboardWatcher.SetOnChange(Value: TNotifyEvent);
begin
FOnChange := Value;
Update;
end;
procedure TClipboardWatcher.WndProc(var Message: TMessage);
begin
with Message do
case Msg of
WM_CHANGECBCHAIN:
try
with TWMChangeCBChain(Message) do
if Remove = FNextWindowHandle then
FNextWindowHandle := Next
else if FNextWindowHandle <> 0 then
SendMessage(FNextWindowHandle, Msg, wParam, lParam);
except
Application.HandleException(Self);
end;
WM_DRAWCLIPBOARD:
try
ClipboardChanged;
SendMessage(FNextWindowHandle, Msg, wParam, lParam);
except
Application.HandleException(Self);
end;
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
end;
procedure TClipboardWatcher.ClipboardChanged; //dynamic;
begin
if Assigned(FOnChange) then FOnChange(Self);
end;
{ Register }
procedure Register;
begin
RegisterComponents('Samples', [TClipboardWatcher]);
end;
end.
ぜえた (QZC05100)
Original document by ぜえた 氏 ID:(QZC05100)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|