2017-08-28 77 views
0

我有兩個使用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

回答

0

如何在任何時候設置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

相關問題