在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(); 

我误解了一些东西吗?为什么这仍然不起作用?

+1

这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

+1

AllowSetForegroundWindow是否返回成功,并且在调用'AllowSetForegroundWindow'和尝试激活进程B之间发生用户输入(因为给予进程B的权限[只要用户生成更多输入(https://msdn.microsoft.com/en-us/library/windows/desktop/ms632668(v = vs.85)的.aspx))? – GSerg

+1

@GSerg我不知道AllowSetForegroundWindow在用户输入上过期。通话之间的确有输入。这个问题解决了:)谢谢! – Excludos

如何在任何时候设置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