【发布时间】:2012-01-05 14:10:51
【问题描述】:
我正在做一些需要监控许多表单的事情。从表单外部,并且不将任何代码放入表单内,我需要以某种方式从这些表单中捕获事件,最有可能以 Windows 消息的形式。但是,您将如何从与其相关的类之外捕获 Windows 消息?
我的项目有一个对象,它包装了它正在监视的每个表单,我认为这个处理将在这个对象中进行。本质上,当我创建一个我想要监控的表单时,我创建了一个相应的对象,该对象又被添加到所有已创建表单的列表中。最重要的是,当该表单关闭时,我必须知道以便从列表中删除该表单的包装对象。
这些事件包括:
- 最小化
- 最大化
- 恢复
- 关闭
- 对焦/对焦
我不想要的:
- 用于此处理的任何表单或表单单元内的任何代码
- 从任何自定义基本表单继承表单
- 使用表单的事件,例如
OnClose,因为它们将用于其他目的
我想要什么:
- 为这些事件处理 Windows 消息
- 关于如何从课堂外获取 windows 消息的任何提示
- 我需要监听哪些 Windows 消息
用相同的信息但不同的方法重写了问题
【问题讨论】:
-
我不太确定,但我认为您也可以考虑代码注入,因为它是由某些 AOP 框架完成的。
-
您知道您可以用自己的处理程序替换表单事件,但保留旧值,然后从您的替换处理程序调用旧处理程序,对吗?这比真正的“代码注入”或真正的“挂钩”要简单。这与大多数操作系统中“中断处理程序”的工作方式非常相似。我们称之为“向量替换”。
-
@WarrenP 我知道这一点,如果大卫没有提到更清洁的方法,我可能会这样做。但是这个策略(至少在我看来)可能有 90-95% 的效率(我可以预见到一些问题会搞砸这种情况)。 David 的解决方案是 100% 有效的。
标签: delphi delphi-7 windows-messages tform