gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:22:58 36 4
gpt4 key购买 nike

我面临着必须拦截和处理 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com