【问题标题】:Windows/C++: detect when focus has changed between windows (globally)Windows/C++:检测窗口之间焦点何时改变(全局)
【发布时间】:2010-06-03 13:33:41
【问题描述】:

我正在尝试寻找一种方法来检测焦点何时更改到另一个窗口(无需每 X 毫秒轮询一次)。

我已经找到了一种方法来检测何时使用 WH_SHELL 和 HSHELL_ACTIVATESHELLWINDOW 在应用程序之间切换焦点。

问题是我想检测焦点何时在同一个应用程序内的对话框/窗口之间切换。

即。在记事本中,我可以确定应用程序何时切换到记事本,但我无法检测到何时出现“打开”或“保存”对话框,因为焦点仍在同一个应用程序中。

【问题讨论】:

  • 嘿@twig 你能告诉我指向一篇文章或资源来检测应用程序切换吗?谢谢
  • 对不起@manishKungwani,我已经回复了下面的代码示例。
  • 非常感谢@twig 我会试一试...

标签: c++ windows winapi


【解决方案1】:

您可以将SetWindowsHookEx 与 WH_CBT 挂钩类型一起使用。如果您只想检测应用程序中的焦点更改,请将 GetCurrentThreadId() 作为最后一个参数传递,否则该挂钩将针对当前桌面上的所有线程。

请注意,使用 windows 挂钩可能会对系统性能产生不利影响,因此应仅在必要时安装挂钩,并且您应该在挂钩过程中做最少的工作。

【讨论】:

  • 谢谢!我会试一试,看看效果如何。
【解决方案2】:

抱歉耽搁了,我这台电脑上没有安装VS,所以找代码有点难。

使用它来将您的代码挂接到系统中。

HHOOK oldShellHook = SetWindowsHookEx(WH_SHELL, BCK_WndShellProc, hDll, NULL);

if (!info->oldShellHook) {
    MessageBox(m_hwnd, L"Failed to load global hook.", strTitle, MB_OK | MB_ICONERROR);
    return;
}

这是你的钩子。根据您正在执行的操作,使用 nMsg 来确定您想要应用自定义逻辑的时间。

LRESULT CALLBACK BCK_WndShellProc(int nMsg, WPARAM wParam, LPARAM lParam) {
    ...
}

阅读MSDN docs for SetWindowsHookEx() 以确保您返回预期值,否则您可能会锁定整个系统。

我在我的Breadcrumb KillerSpasm(在开始菜单上显示所有程序)程序上使用了类似的代码,它似乎工作正常。

【讨论】:

    【解决方案3】:

    “基于计算机的培训 API”怎么样; SetWindowsHookExWH_CBT 这将使您能够收到 HCBT_SETFOCUS (among others)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多