在Windows 10中将另一个应用程序置于另一个应用程序的前面
问题描述:
我有两个使用Qt运行的独立进程,我需要能够将一个应用程序放在另一个之前。他们都相互沟通,所以你会认为这不会是一个大问题。不过Windows 10对此特别严格。我所能做的就是在窗口工具栏中使我想要的窗口闪烁橙色。在Windows 10中将另一个应用程序置于另一个应用程序的前面
代码我试图用至今:
A级(当前活动):
AllowSetForegroundWindow(ASFW_ANY);
B类(一个我想在前面带):
#ifdef WIN32
if(hWnd)
{
SetForegroundWindow(hWnd);
SetActiveWindow(hWnd);
BringWindowToTop(hWnd);
}
#endif
hWnd得到较早(虽然B类是活动窗口)与:
hWnd = GetActiveWindow();
我误解了一些东西吗?为什么这仍然不起作用?
答
如何在任何时候设置Qt/Windows小部件?
已经面临着不少问题,如下面的解决方案上面的工作对我来说:
void widgetToTop(QWidget* widget)
{
bool wasMax = widget->isMaximized();
bool wasMin = widget->isMinimized();
HWND h = (HWND)widget->winId();
if (wasMax || wasMin)
{
::ShowWindow(h, SW_SHOW);
::ShowWindow(h, wasMax ? SW_MAXIMIZE : SW_RESTORE);
::SetForegroundWindow(h);
}
else
{
::ShowWindow(h, SW_SHOWNORMAL);
::SetForegroundWindow(h);
}
}
这当然可以用纯粹的Win32 API进行返工。
P.S.也许解决方案并不是完全“在另一个之上”,但可能它就足够了。
+0
如果这两个窗口是相同的一部分,这将工作过程。如果他们是独立的进程,因为是我的话,那么它只会工作,如果前台窗口特别允许把另一个进程跳到前台代替它,并(作为是我的错)准许只持续到接下来的用户输入。我相信这在Windows 10引入阻止潜在的垃圾邮件的弹出窗口。 – Excludos
这Qt的解决方法至少已经在Windows 7下工作对我来说与8.1 也许它仍然将在Windows 10 这个 - > setWindowState((这 - > WINDOWSTATE()〜Qt的:: WindowMinimized)下工作| Qt的:: WindowActive); this-> setVisible(false); this-> setVisible(true); this-> setFocus(); BringWindowToTop((HWND)this-> winId()); _this_是QWidget的子类 – Xplatforms
AllowSetForegroundWindow是否返回成功,并且在调用'AllowSetForegroundWindow'和尝试激活进程B之间发生用户输入(因为给予进程B的权限[只要用户生成更多输入(https://msdn.microsoft.com/en-us/library/windows/desktop/ms632668(v = vs.85)的.aspx))? – GSerg
@GSerg我不知道AllowSetForegroundWindow在用户输入上过期。通话之间的确有输入。这个问题解决了:)谢谢! – Excludos