gpt4 book ai didi

c++ - 程序更新后 SetForegroundWindow() 失败

转载 作者:可可西里 更新时间:2023-11-01 10:36:43 24 4
gpt4 key购买 nike

我写了一个图像匹配 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);

这似乎可以最小化窗口并将其重新打开,从而使其聚焦,但这不是解决方案,因为图像匹配过程应该根据用户的需要持续进行。

感谢任何帮助!

最佳答案

当 SetForeground 不起作用时,您需要“窃取焦点”。不赞成,因为其他程序可能依赖于聚焦窗口。基本上,只有当前前台窗口可以将属于另一个程序的窗口设置为前台。我相信这是在 Vista 中引入的。

请小心使用。

bool ForceToForeground(HWND hWnd)
{
HWND hForeground = GetForegroundWindow();

int curThread = GetCurrentThreadId();
int remoteThread = GetWindowThreadProcessId(hForeground,0);

AttachThreadInput( curThread, remoteThread, TRUE);
SetForegroundWindow(hWnd);
AttachThreadInput( curThread, remoteThread, FALSE);

return GetForegroundWindow() == hWnd;
}

关于c++ - 程序更新后 SetForegroundWindow() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com