我正在做一些需要监控多种表单的事情。从表单外部,并且不将任何代码放入表单内,我需要以某种方式从这些表单捕获事件,很可能以 Windows 消息的形式。但是如何从与之相关的类外部捕获 Windows 消息呢?
我的项目有一个对象,它包装了它正在监视的每个表单,我认为此处理将在该对象中进行。本质上,当我创建要监视的表单时,我创建了一个相应的对象,该对象又被添加到所有已创建表单的列表中。最重要的是,当该表单关闭时,我必须知道,以便我可以从列表中删除该表单的包装对象。
这些事件包括:
- 最小化
- 最大化
- 恢复
- 关闭
- 聚焦/聚焦
我不想要什么:
- 任何表单或表单单元内用于此处理的任何代码
- 从任何自定义基本表单继承表单
- 使用表单的事件,例如
OnClose
,因为它们将用于其他目的
我想要什么:
- 处理这些事件的 Windows 消息
- 有关如何从类外获取 Windows 消息的任何提示
- 我需要监听哪些 Windows 消息
使用相同信息但不同方法重新编写的问题
最佳答案
您需要监听传递到表单的特定 Windows 消息。最简单的方法是分配 WindowProc
表单的属性。请记住保留 WindowProc
的先前值并从替换中调用它。
在包装对象中声明一个如下所示的字段:
FOriginalWindowProc: TWndMethod;
然后在包装器的构造函数中执行以下操作:
FOriginalWindowProc := Form.WindowProc;
Form.WindowProc := NewWindowProc;
最后,实现替换窗口过程:
procedure TFormWrapper.NewWindowProc(var Message: TMessage);
begin
//test for and respond to the messages of interest
FOriginalWindowProc(Message);
end;
关于delphi - 如何从表单外部捕获表单的某些事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743876/