加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:21:51 所属栏目:大数据 来源:网络整理
导读:我面临着一个艰巨的任务,即只要将其发送到表单上的任何TWinControl,就必须拦截和处理 WM_GETOBJECT 消息. 每个小组 每个嵌套面板 每个编辑框 每个组合框 每个按钮 每个工具栏 每个日期时间选择器 每个图像 每个列表视图 每一个树木 每一个胜利控制 在每个表
我面临着一个艰巨的任务,即只要将其发送到表单上的任何TWinControl,就必须拦截和处理 WM_GETOBJECT消息.

>每个小组
>每个嵌套面板
>每个编辑框
>每个组合框
>每个按钮
>每个工具栏
>每个日期时间选择器
>每个图像
>每个列表视图
>每一个树木
>每一个胜利控制
>在每个表格上

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

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

有没有办法参与处理使用SendMessage直接发送到子控件的每个消息

>类似于TApplicationEvents.OnMessage如何拦截每个发布的消息
>类似于KeyPreview允许表单查看每个发送密钥消息的方式

解决方法

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

如果您需要给定HWND的TWinControl *指针,则可以在Vcl.Controls单元中使用VCL的FindControl()功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读