delphi - 如何从表单外部捕获表单的某些事件?

标签 delphi delphi-7 windows-messages tform

我正在做一些需要监控多种表单的事情。从表单外部,并且不将任何代码放入表单内,我需要以某种方式从这些表单捕获事件,很可能以 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/

相关文章:

Delphi 7,使用 UNC 选择目录

delphi - 鼠标滚轮将消息发送到错误的控件

c++ - 在 Windows7 中从安全屏幕 (Ctrl+Alt+Del) 返回时未收到 WM_PAINT 消息

c# - 如何在 Delphi 中使用 C# 创建的 DLL

delphi - 如何使用 Delphi 将多个文件压缩到一个存档中

德尔福7 : Handling events in console application (TidIRC)

sql-server - 区域日期格式和数据库日期格式的不同日期格式的 SQL Server 错误

Delphi - 如何向 TDataModule 发送 Windows 消息?

delphi - *.lps 文件应该包含在版本控制中还是被忽略?

sql-server-2008 - 使用 Native Client 10 将 TDateTime 字段插入 SQL 2008 DB