お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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