如何拦截发送到我表单上任何 TWinControl 的消息?
How to intercept a message sent to any TWinControl on my form?
我面临着一项艰巨的任务,即每当 WM_GETOBJECT
消息发送到表单上的任何 TWinControl
时,我都必须拦截并处理它。
- 每个面板
- 每个嵌套面板
- 每个编辑框
- 每个组合框
- 每个按钮
- 每个工具栏
- 每个日期时间选择器
- 每张图片
- 每个列表视图
- 每棵树都
- 每场胜利控制
- 每个表格
显然我不希望必须单独对每个控件进行子类化:
- 很难做到正确(人们可能会在想要开始子类化时使用 SetWindowSubclass,在完成时使用 RemoveWindowSubclass,并且没有意识到他们刚刚引入的崩溃)
- 是difficult to do correctly
- 它需要单独对每个控件进行子类化,可能是通过子控件迭代函数(如果在创建表单句柄时应用它并在销毁表单句柄时删除它们,则存在失败的常见错误)
有没有办法参与使用 SendMessage
处理直接发送到子控件的每条消息
- 类似于 TApplicationEvents.OnMessage 拦截每条已发布消息的方式
- 类似于 KeyPreview 允许表单查看每条发送 Key 消息的方式
如果您不想子类化每个单独的控件(这当然是一个选项,并且可以使用插入器 类 进行简化),那么您可以改用 thread-specific WH_CALLWNDPROC
or WH_CALLWNDPROCRET
hook via the Win32 API SetWindowsHookEx()
函数。钩子会告诉你哪个 HWND
正在接收每条消息,当钩子与钩子在同一进程中时,你不需要在 DLL 中实现钩子。
如果您需要给定 HWND
的 TWinControl*
指针,您可以在 Vcl.Controls
单元中使用 VCL 的 FindControl()
函数。
我面临着一项艰巨的任务,即每当 WM_GETOBJECT
消息发送到表单上的任何 TWinControl
时,我都必须拦截并处理它。
- 每个面板
- 每个嵌套面板
- 每个编辑框
- 每个组合框
- 每个按钮
- 每个工具栏
- 每个日期时间选择器
- 每张图片
- 每个列表视图
- 每棵树都
- 每场胜利控制
- 每个表格
显然我不希望必须单独对每个控件进行子类化:
- 很难做到正确(人们可能会在想要开始子类化时使用 SetWindowSubclass,在完成时使用 RemoveWindowSubclass,并且没有意识到他们刚刚引入的崩溃)
- 是difficult to do correctly
- 它需要单独对每个控件进行子类化,可能是通过子控件迭代函数(如果在创建表单句柄时应用它并在销毁表单句柄时删除它们,则存在失败的常见错误)
有没有办法参与使用 SendMessage
处理直接发送到子控件的每条消息- 类似于 TApplicationEvents.OnMessage 拦截每条已发布消息的方式
- 类似于 KeyPreview 允许表单查看每条发送 Key 消息的方式
如果您不想子类化每个单独的控件(这当然是一个选项,并且可以使用插入器 类 进行简化),那么您可以改用 thread-specific WH_CALLWNDPROC
or WH_CALLWNDPROCRET
hook via the Win32 API SetWindowsHookEx()
函数。钩子会告诉你哪个 HWND
正在接收每条消息,当钩子与钩子在同一进程中时,你不需要在 DLL 中实现钩子。
如果您需要给定 HWND
的 TWinControl*
指针,您可以在 Vcl.Controls
单元中使用 VCL 的 FindControl()
函数。