【问题标题】:Trap WM_SETFOCUS message陷阱 WM_SETFOCUS 消息
【发布时间】:2010-01-26 09:20:28
【问题描述】:

我想在所有当前窗口中捕获 WM_SETFOCUS 消息。 最好的方法是什么?

我认为 SetWindowsHookEx 可以用于此目的。可以和 WH_CALLWNDPROC 或 WH_MSGFILTER 一起使用吗?

另外,它提到钩子程序必须在单独的 DLL 中。是否需要。 我可以在安装钩子的同一个 DLL 中没有钩子过程吗?

【问题讨论】:

    标签: c++ winapi hook


    【解决方案1】:

    是的,您可以在安装钩子的同一个 DLL 中拥有钩子 proc。我相信您所说的要求与您在另一个进程中设置窗口挂钩时有关。

    我不熟悉 WH_CALLWNDPROC 钩子类型,但我相信您可以使用 WH_CBT,它被描述为对“基于计算机的培训”应用程序很有用,但似乎也有一些非常有用的功能。它被通知的事件之一是:

    HCBT_SETFOCUS
    一个窗口即将获得键盘焦点。

    【讨论】:

      【解决方案2】:

      hook proc 必须在 dll 中,但它不必是与用于安装 hook 的 dll 不同的 dll。文档提到“单独的 dll”的原因是因为他们假设安装钩子的代码将在 exe 中而不是 dll 中。

      WH_CALLWNDPROC 挂钩应该看到 WM_SETFOCUS 消息,我不希望 WH_MSGFILTER 挂钩看到它们,但我不确定。

      您应该知道,如果您打算吃 WM_SETFOCUS 消息,这不会阻止焦点设置到窗口。

      无论您遇到什么问题,Windows 挂钩都不是最佳解决方案。如果您能更具体地说明您想要做什么,我们可能会更有帮助。

      【讨论】:

      • 虽然我从未亲自使用过它,但 CBTProc 文档指出可以为 HCBT_SETFOCUS nCode 停止焦点。我同意这似乎有点笨拙,而且它不是平板电脑输入面板之类的工作方式。
      • 是的,CBT 挂钩是一种特殊情况。它们用于“基于计算机的培训”,因此您希望允许计算机有时伪装成用户并监控用户所做的事情的理论 - 他们基本上将整个系统置于一种单线程模式和然后让钩子把事情搞砸。
      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多