截获应用程序的另一个方法是用 application.HookMainwindow 的方法来截获,这个同样不也不能截获
sendMessage 中的消息
它的原理是把自定义的消息处理过程插入到 application.WndProc 方法前,这样就可以对消息进行处理了
application 的 HookMainWindow 的定义为
procedure TApplication.HookMainWindow(Hook: TWindowHook);
这里的参数是 TWindowHook
TWindowHook = function (var Message: TMessage): Boolean of object;
看着有点和 TWndMethod 方法相似
TWndMehtod = procedure (var msg:TMessage) of object;
一个是过程,一个是方法
指定一个 HookMainWindow 后,程序关闭时要 UnHookMainWindow
对 HookMainWindow 的应用很简单
下面是一个简单的例子
----------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
function hookMain(var msg:TMessage):boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.hookMain(var msg:TMessage):boolean;
begin
result := true;
memo1.Lines.Add(format('message ID %x,wParam :%x,lParam:%x',[msg.msg,msg.wparam,msg.lparam]));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
application.HookMainWindow(self.hookMain);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
application.UnhookMainWindow(self.hookMain);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
postmessage(application.Handle,wm_null,0,0);
end;
end.