如何拦截发送到我表单上的任何TWinControl的消息?

时间:2018-03-29 15:01:16

标签: delphi delphi-xe6

我遇到了一个艰巨的任务,即只要将WM_GETOBJECT消息发送到表单上的任何TWinControl,就必须拦截并处理该消息。

  • 每个小组
  • 每个嵌套面板
  • 每个编辑框
  • 每个组合框
  • 每个按钮
  • 每个工具栏
  • 每个日期时间选择器
  • 每张图片
  • 每个listview
  • 每一个treeivew
  • 每个胜利控制
  • 每个表格上的

显然,我不希望单独对每个控件进行子类化:

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

是否可以使用 SendMessage

参与处理直接发送到子控件的每封邮件
  • 类似于 TApplicationEvents.OnMessage 如何拦截每条已发布的消息
  • 类似于 KeyPreview 允许表单查看每封发送密钥消息的方式

1 个答案:

答案 0 :(得分:7)

如果您不想为每个单独的控件创建子类(这当然是一个选项,例如可以使用内插器类进行简化),那么您可以改为使用特定于线程的{{3} }或WH_CALLWNDPROC通过Win32 API WH_CALLWNDPROCRET函数挂钩。钩子将告诉你哪个HWND正在接收每条消息,并且在与钩子相同的进程中挂钩线程时,你不需要在DLL中实现钩子。

如果您需要指定TWinControl*的{​​{1}}指针,则可以使用HWND单元中的VCL SetWindowsHookEx()功能。