delphi - 如何拦截发送到窗体上任何 TWinControl 的消息?

标签 delphi delphi-xe6

我面临着必须拦截和处理 WM_GETOBJECT 的艰巨任务。每当发送到表单上的任何 TWinControl 时都会发送消息。

  • 每个面板
  • 每个嵌套面板
  • 每个编辑框
  • 每个组合框
  • 每个按钮
  • 每个工具栏
  • 每个日期时间选择器
  • 每张图片
  • 每个 ListView
  • 每棵树
  • 每次获胜控制
  • 每个表单

显然我不想单独子类化每个控件:

  • 很难正确地做到这一点(可能人们在想要开始子类化时使用SetWindowSubclass,并在完成时使用RemoveWindowSubclass,并且没有意识到他们的崩溃刚刚介绍)
  • difficult to do correctly
  • 它需要单独子类化每个控件,可能是通过子控件迭代函数(如果您在创建表单句柄时应用它并在表单句柄被销毁时删除它们,则存在失败的常见错误)

有没有办法参与处理使用 SendMessage 直接发送到子控件的每条消息

  • 类似于TApplicationEvents.OnMessage如何拦截每条发布的消息
  • 类似于KeyPreview允许表单查看每条发送的Key消息

最佳答案

如果您不想对每个单独的控件进行子类化(这当然是一种选择,并且可以使用插入器类来简化,例如),那么您可以使用线程特定的 WH_CALLWNDPROCWH_CALLWNDPROCRET通过 Win32 API Hook SetWindowsHookEx()功能。钩子(Hook)会告诉您哪个 HWND 正在接收每条消息,并且当钩子(Hook)与钩子(Hook)位于同一进程中时,您不需要在 DLL 中实现钩子(Hook)。

如果您需要给定 HWNDTWinControl* 指针,则可以使用 VCL 的 FindControl() Vcl.Controls 单元中的函数。

关于delphi - 如何拦截发送到窗体上任何 TWinControl 的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559350/

相关文章:

delphi - 从 ComboBox DrawItem 事件中的 TImageList 复制透明(32 位 alpha)位图

Delphi 2010/XE bds 上出现堆栈空间溢出错误 :/default. htm

delphi - 如何在Delphi中使用宏?

delphi - H2161 警告 : Duplicate resource: Type 10 (RCDATA)

android - Delphi XE6 发布请求和印地

macos - 检测 OSX 上多设备应用程序的空闲时间

delphi - 如何通过在Delphi中包含exe的数字签名来自动化多个项目构建过程?

delphi - 启用调试信息后,无法在发布配置中调试 64 位应用程序

android - Firemonkey TWebBrowser 输入替代?

database - Firemonkey 应用程序的嵌入式数据库