【问题标题】:How to intercept a message sent to any TWinControl on my form?如何拦截发送到表单上任何 TWinControl 的消息?
【发布时间】:2018-09-08 14:31:33
【问题描述】:

每当WM_GETOBJECT 消息发送到表单上的任何TWinControl 时,我都面临着一项艰巨的任务。

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

显然我不希望每个控件都单独子类化:

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

有没有办法参与处理使用 SendMessage

直接发送到子控件的每条消息
  • 类似于 TApplicationEvents.OnMessage 可以拦截每条发布的消息
  • 类似于 KeyPreview 允许表单查看每个发送 Key 消息的方式

【问题讨论】:

  • 列举孩子。使用 WndProc 拦截消息。
  • @DavidHeffernan:我想你的意思是WindowProc。但这仍然需要单独对每个控件进行子类化,并且当您有很多控件要子类化时,这会变得很棘手。

标签: delphi delphi-xe6


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多