【发布时间】:2010-01-26 09:20:28
【问题描述】:
我想在所有当前窗口中捕获 WM_SETFOCUS 消息。 最好的方法是什么?
我认为 SetWindowsHookEx 可以用于此目的。可以和 WH_CALLWNDPROC 或 WH_MSGFILTER 一起使用吗?
另外,它提到钩子程序必须在单独的 DLL 中。是否需要。 我可以在安装钩子的同一个 DLL 中没有钩子过程吗?
【问题讨论】:
我想在所有当前窗口中捕获 WM_SETFOCUS 消息。 最好的方法是什么?
我认为 SetWindowsHookEx 可以用于此目的。可以和 WH_CALLWNDPROC 或 WH_MSGFILTER 一起使用吗?
另外,它提到钩子程序必须在单独的 DLL 中。是否需要。 我可以在安装钩子的同一个 DLL 中没有钩子过程吗?
【问题讨论】:
是的,您可以在安装钩子的同一个 DLL 中拥有钩子 proc。我相信您所说的要求与您在另一个进程中设置窗口挂钩时有关。
我不熟悉 WH_CALLWNDPROC 钩子类型,但我相信您可以使用 WH_CBT,它被描述为对“基于计算机的培训”应用程序很有用,但似乎也有一些非常有用的功能。它被通知的事件之一是:
HCBT_SETFOCUS
一个窗口即将获得键盘焦点。
【讨论】:
hook proc 必须在 dll 中,但它不必是与用于安装 hook 的 dll 不同的 dll。文档提到“单独的 dll”的原因是因为他们假设安装钩子的代码将在 exe 中而不是 dll 中。
WH_CALLWNDPROC 挂钩应该看到 WM_SETFOCUS 消息,我不希望 WH_MSGFILTER 挂钩看到它们,但我不确定。
您应该知道,如果您打算吃 WM_SETFOCUS 消息,这不会阻止焦点设置到窗口。
无论您遇到什么问题,Windows 挂钩都不是最佳解决方案。如果您能更具体地说明您想要做什么,我们可能会更有帮助。
【讨论】: