我正试图找到一种方法来检测何时将焦点更改为另一个窗口(无需每隔X毫秒轮询一次)。
我已经找到了一种方法来检测何时使用WH_SHELL和HSHELL_ACTIVATESHELLWINDOW在应用程序之间切换焦点。
问题是我想检测何时在同一个应用程序中的对话框/窗口之间切换焦点。
即。在记事本中,我可以确定应用程序何时切换到记事本,但我无法检测何时出现“打开”或“保存”对话框,因为焦点仍在同一个应用程序中。
答案 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 Killer和Spasm(显示“开始”菜单上的所有程序)程序中使用与此类似的代码,它似乎工作正常。
答案 2 :(得分:0)
“基于计算机的培训API”怎么样; SetWindowsHookEx
WH_CBT
HCBT_SETFOCUS
,可让您接收{{1}}(among others)