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”怎么样; SetWindowsHookExWH_CBT 这将使您能够收到 HCBT_SETFOCUS (among others)

【讨论】:

以上是关于Windows/C++:检测窗口之间焦点何时改变(全局)的主要内容,如果未能解决你的问题,请参考以下文章

在Selenium中的单个窗口中改变不同页面之间的驱动焦点

使用 JQuery 检测容器和子元素何时失去焦点

Java中的事件监听器没有应用程序有焦点? (全局按键检测)

如何使用 Javascript 在 Chrome 中检测选项卡何时聚焦或不聚焦?

WPF UserControl检测LostFocus忽略儿童

检测窗口何时停止移动?