Windows/C++:检测窗口之间焦点何时改变(全局)
Posted
技术标签:
【中文标题】Windows/C++:检测窗口之间焦点何时改变(全局)【英文标题】:Windows/C++: detect when focus has changed between windows (globally) 【发布时间】:2010-06-03 13:33:41 【问题描述】:我正在尝试寻找一种方法来检测焦点何时更改到另一个窗口(无需每 X 毫秒轮询一次)。
我已经找到了一种方法来检测何时使用 WH_SHELL 和 HSHELL_ACTIVATESHELLWINDOW 在应用程序之间切换焦点。
问题是我想检测焦点何时在同一个应用程序内的对话框/窗口之间切换。
即。在记事本中,我可以确定应用程序何时切换到记事本,但我无法检测到何时出现“打开”或“保存”对话框,因为焦点仍在同一个应用程序中。
【问题讨论】:
嘿@twig 你能告诉我指向一篇文章或资源来检测应用程序切换吗?谢谢 对不起@manishKungwani,我已经回复了下面的代码示例。 非常感谢@twig 我会试一试... 【参考方案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 Killer 和Spasm(在开始菜单上显示所有程序)程序上使用了类似的代码,它似乎工作正常。
【讨论】:
【参考方案3】:“基于计算机的培训 API”怎么样; SetWindowsHookEx
和 WH_CBT
这将使您能够收到 HCBT_SETFOCUS
(among others)
【讨论】:
以上是关于Windows/C++:检测窗口之间焦点何时改变(全局)的主要内容,如果未能解决你的问题,请参考以下文章
Java中的事件监听器没有应用程序有焦点? (全局按键检测)
如何使用 Javascript 在 Chrome 中检测选项卡何时聚焦或不聚焦?