【发布时间】:2014-04-01 09:44:51
【问题描述】:
我编写了一个图像匹配 C++ 工具,它是一个通知区域工具(无可见窗口)。它获得了另一个窗口的句柄并将其聚焦,然后进行了保存的图像匹配。现在这个工具正在完善,但程序的制造者(不是我写的)我正在关注推送一个更新,这改变了他们的程序。
因此,我似乎无法再设置程序的焦点(将其置于所有窗口的顶部)。我尝试以管理员身份运行但没有运气。我可以看到任务栏中的图标闪烁橙色,表示它处于活动状态,但窗口不会出现在前台。
这是我的工具的隐形 hwnd:
hwnd = CreateWindowEx (0, className,
TEXT( "" ),
WS_OVERLAPPEDWINDOW,
0, 0,
0, 0,
NULL, NULL,
hInstance, NULL);
这是我在函数顶部的代码,用于匹配图像:
ShowWindow(handle, SW_SHOWDEFAULT); //maximize handle
SetForegroundWindow(handle); //bring to foreground
我使用 SW_SHOWDEFAULT 而不是 SW_SHOW 和 showWindow,因为这解决了我遇到的一个问题,如果该工具被最小化,它将无法匹配图像,因为窗口被隐藏了。
看起来 SetForegroundWindow() 在之前工作时现在返回 0(失败)。我未能找到有效的在线解决方案。
唯一有效的(有点)是这样的:
ShowWindow(handle, SW_MINIMIZE);
ShowWindow(handle, SW_SHOWDEFAULT);
这似乎是最小化窗口并将其重新打开,从而使其聚焦,但这不是解决方案,因为图像匹配过程应该持续用户想要的时间。
感谢任何帮助!
【问题讨论】:
-
SetForegroundWindow失败时GetLastError()返回的值是多少?你读过msdn.microsoft.com/en-us/library/windows/desktop/ms633539.aspx中的Remarks吗? -
我似乎无法从 GetLastError() 得到任何东西,但 SetForegroundWindow 的返回肯定是 0(失败)。我看过评论,不知道我是否失败了。 “Windows 闪烁任务栏”是我得到的暗示我不符合条件。我只是尝试双击通知区域中的图标,而该工具试图在循环中设置前景窗口并且它有效,它设法设置它(因为我发送了最后一个事件?)。有什么想法吗?
-
此页面上的 Alt-Tab 方法似乎对我有用:codeproject.com/Tips/76427/… 使用此“hack”的含义是什么。如果找不到其他选择,我很想使用它。
-
Window 努力禁止“窃取焦点”,这是有充分理由的。
-
其中一条规则是,如果您自己不是前台,则不能更改前台窗口。您从未设置窗口前景,这意味着您无权更改前景。解决方案:在隐藏窗口上调用 SetForegroundWindow(现在你有前景并有权更改前景),然后在另一个窗口上调用 SetForegroundWindow。
标签: c++ windows winapi windows-7