2009-02-10 34 views
2

我有一段代碼,它使用SetForegroundWindow API for WinXP將光標下的窗口置於前臺。我一直在測試它的Vista,但API似乎不再正確地完成這項工作。如何在Vista中使用C++將窗口置於前臺?

AllowSetForeground沒有幫助,我的過程是一個後臺進程。

我可以用什麼來實現這個目標?

回答

7

試試下面的代碼,看看它是否適合你:

SetWindowPos(WndHandle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); 
SetWindowPos(WndHandle,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); 
+0

這會爲我 - 是隻有一件事(使用MINIMIZE調用ShowWindow,然後使用帶有RESTORE的ShowWindow),它使窗口處於前面。其他嘗試,包括SetForegroundWindow和BringWindowToFront Just-Dont-Work,但是This-Approach-Does。 – 2012-02-16 05:49:55

+0

你輸入「OR」這個詞......是爲了避免noobs複製麪食? – 2015-03-04 02:31:36

1

如果SetForegroundWindow()失敗,你嘗試過,然後調用SetForegroundWindow()後非頂最右邊的設置窗口WS_EX_TOPMOST和?

這可能與人們正確地抱怨應用程序在你最不期待的時候出現在應用程序中。

0
VOID SwitchToThisWindow(HWND hWnd, BOOL fAltTab); 

工程在XP到Windows 7 http://msdn.microsoft.com/en-us/library/ms633553.aspx

+0

不幸的是「[此功能不適用於一般用途,可能會在後續版本的Windows中更改或無法使用。]」:( – 2012-02-16 05:46:31

2

只是一個警告:有一個公共API來做到這一點(SetForegroundWindow),現在它不帶在前臺窗口了。

現在窗口只是閃爍。

但這是有原因的。應用程序會從當前窗口「竊取」焦點(通常沒有很好的理由),並可能導致所有類型的問題。

所以在試圖規避操作系統對這種行爲的保護之前,請確保您不會惹惱您的用戶。問問自己:「即使我的應用程序在後臺,我真的 - 真的必須跳到用戶的臉上嗎?」

1

如果使用MFC,這爲我工作在Windows 7 64位系統:

RECT rc; 
    m_pMainWnd->GetWindowRect(&rc); 

    int nBoxWidth = rc.left-rc.right; 
    int nBoxHeight = rc.bottom-rc.top; 
    int nBoxTop = rc.top; 
    int nBoxLeft = rc.left; 

    SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_TOPMOST, 
        nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight, 
        SWP_NOMOVE || SWP_NOSIZE); 
    SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_NOTOPMOST, 
        nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight, 
        SWP_SHOWWINDOW || SWP_NOMOVE || SWP_NOSIZE); 
-3

使用Windows PowerToys的TweakUI程序來改變許可狀態的焦點。

選擇「一般」,然後選擇「焦點」,然後取消選中允許其他程序關注的框。

當每個人的建議似乎都不起作用時(這實際上都行),這是有效的。

微軟在這個無限的智慧決定,從setforegrondwindow等調用響應等現在將爲空。

他們沒有打擾說tjat你仍然可以通過tweakui回到原來的!

享受.....

0

與之前設置非最上面的設置當前線程睡着這麼做是爲了我,一起:

OS.SetWindowPos(handle, OS.HWND_NOTOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE); 
try { 
    Thread.sleep(100); 
} catch (InterruptedException e) { 
    LOG.error("sleeping thread was interrupted", e); 
} 
OS.SetWindowPos(handle, OS.HWND_TOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE); 
相關問題