Jer*_*dge 7 delphi delphi-7 tform windows-messages
我正在研究需要监控多种形式的东西.从表单外部,并且不在表单中放置任何代码,我需要以某种方式从这些表单中捕获事件,最有可能以Windows消息的形式.但是你如何捕获与它相关的类外的Windows消息呢?
我的项目有一个对象,它包装它正在监视的每个表单,我认为这个处理将进入这个对象.基本上,当我创建一个我想要监视的表单时,我创建了一个相应的对象,该对象又被添加到所有已创建表单的列表中.最重要的是,当该表单关闭时,我必须知道所以我可以从列表中删除此表单的包装器对象.
这些活动包括:
我不想要的:
OnClose因为它们将用于其他目的我想要的是:
问题用相同的信息重写,但方法不同
您需要侦听传递给表单的特定Windows消息.最简单的方法是分配WindowProc表单的属性.请记住保持之前的值WindowProc并从替换中调用它.
在你的包装器对象中声明一个这样的字段:
FOriginalWindowProc: TWndMethod;
Run Code Online (Sandbox Code Playgroud)
然后在包装器的构造函数中执行以下操作:
FOriginalWindowProc := Form.WindowProc;
Form.WindowProc := NewWindowProc;
Run Code Online (Sandbox Code Playgroud)
最后,实现替换窗口过程:
procedure TFormWrapper.NewWindowProc(var Message: TMessage);
begin
//test for and respond to the messages of interest
FOriginalWindowProc(Message);
end;
Run Code Online (Sandbox Code Playgroud)
以下是David提供的解决方案的更完整示例:
private
{ Private declarations }
SaveProc : TWndMethod;
procedure CommonWindowProc(var Message: TMessage);
...
procedure TForm1.Button1Click(Sender: TObject);
var
f : tForm2;
begin
f := tForm2.Create(nil);
SaveProc := f.WindowProc;
f.WindowProc := CommonWindowProc;
f.Show;
end;
procedure TForm1.CommonWindowProc(var Message: TMessage);
begin
case Message.Msg of
WM_SIZE : Memo1.Lines.Add('Resizing');
WM_CLOSE : Memo1.Lines.Add('Closing');
CM_MOUSEENTER : Memo1.Lines.Add('Mouse enter form');
CM_MOUSELEAVE : Memo1.Lines.Add('Mouse leaving form');
// all other messages will be available as needed
end;
SaveProc(Message); // Call the original handler for the other form
end;
Run Code Online (Sandbox Code Playgroud)