我面临着必须拦截和处理 WM_GETOBJECT
的艰巨任务。每当发送到表单上的任何 TWinControl
时都会发送消息。
- 每个面板
- 每个嵌套面板
- 每个编辑框
- 每个组合框
- 每个按钮
- 每个工具栏
- 每个日期时间选择器
- 每张图片
- 每个 ListView
- 每棵树
- 每次获胜控制
- 每个表单
显然我不想单独子类化每个控件:
- 很难正确地做到这一点(可能人们在想要开始子类化时使用SetWindowSubclass,并在完成时使用RemoveWindowSubclass,并且没有意识到他们的崩溃刚刚介绍)
- 是 difficult to do correctly
- 它需要单独子类化每个控件,可能是通过子控件迭代函数(如果您在创建表单句柄时应用它并在表单句柄被销毁时删除它们,则存在失败的常见错误)
有没有办法参与处理使用 SendMessage 直接发送到子控件的每条消息
- 类似于TApplicationEvents.OnMessage如何拦截每条发布的消息
- 类似于KeyPreview允许表单查看每条发送的Key消息
最佳答案
如果您不想对每个单独的控件进行子类化(这当然是一种选择,并且可以使用插入器类来简化,例如),那么您可以使用线程特定的 WH_CALLWNDPROC
或WH_CALLWNDPROCRET
通过 Win32 API Hook SetWindowsHookEx()
功能。钩子(Hook)会告诉您哪个 HWND
正在接收每条消息,并且当钩子(Hook)与钩子(Hook)位于同一进程中时,您不需要在 DLL 中实现钩子(Hook)。
如果您需要给定 HWND
的 TWinControl*
指针,则可以使用 VCL 的 FindControl()
Vcl.Controls
单元中的函数。
关于delphi - 如何拦截发送到窗体上任何 TWinControl 的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559350/