メッセージをフックする

ここではAPIを使用して自ウインドウへのメッセージ(WM_MOVE、WM_SIZE、WM_CLOSE)をフックする方法を説明します。このメッセージフックの方法は結構使えるので知らない人は覚えておきましょう。


■使用するAPI関数

■メッセージ 

■ソースは下記のようになります。

Private部
Private
 FHookWndProc : Pointer;
 FAddress   : Pointer;
 procedure HookWndProc( var Msg:TMessage );


メッセージをフックする処理
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //フック終了
  SetWindowLong(Form1.Handle,GWL_WNDPROC,Longint(FAddress));
  FreeObjectInstance(FHookWndProc);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //フック開始
  FHookWndProc := MakeObjectInstance(HookWndProc);
  FAddress :=Pointer(SetWindowLong(Form1.Handle, GWL_WNDPROC, Longint(FHookWndProc ))) ;
end;

{メッセージを捕まえる}
procedure TForm1.HookWndProc( var Msg:TMessage );
begin

 case Msg.Msg of
  WM_SIZE : ShowMessage('ウインドウのサイズが変更した。');
  WM_MOVE : ShowMessage('ウインドウが移動した') ;
  WM_CLOSE : ShowMessage('終了すんのはやくない?');
 end;

 With Msg do
 begin
  //メッセージを横流しする(重要)
  Result := CallWindowProc(FAddress ,Handle,Msg,WParam,LParam );
 end;

end;




Win32APIのページへ



ホーム PV ランキング