Windows / C ++:检测窗口之间焦点何时发生变化(全局)

时间:2010-06-03 13:33:41

标签: c++ windows winapi

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

请注意,使用Windows挂钩会对系统性能产生负面影响,因此只应在必要时安装挂钩,并且您应该在挂钩过程中执行最少量的工作。

答案 1 :(得分:1)

很抱歉延迟,我没​​有在这台电脑上安装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(显示“开始”菜单上的所有程序)程序中使用与此类似的代码,它似乎工作正常。

答案 2 :(得分:0)

“基于计算机的培训API”怎么样; SetWindowsHookEx WH_CBT HCBT_SETFOCUS,可让您接收{{1}}(among others