截获应用程序的另一个方法是用 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.
本文介绍了一种在Delphi中使用application.HookMainWindow方法来拦截窗口消息的技术。通过自定义消息处理函数并将其注册到application.WndProc之前,可以实现对特定消息的捕获与处理。文章提供了一个具体的实例,展示了如何在程序启动时设置拦截函数,并在程序退出时取消注册。

1259

被折叠的 条评论
为什么被折叠?



