2016-06-30 143 views
-1
m_pMainWnd->SetForegroundWindow(); 
m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 

我用上面的幾行把我的一個窗口放在頂部。但令我失望的是,沒有任何事情發生。 雖然使用< & CWnd :: wndTopMost>是最重要的窗口,但沒有關注它。 VS15,mfc儘管使用setwindowpos,爲什麼窗口沒有達到最高?

+0

難道是'SetForegroundWindow'的限制,即不會在任務欄進入閃光呢? –

+0

是的,它閃爍,但如何克服? –

+2

如果用戶希望窗口位於Z順序的頂部,他們將切換到該窗口。作爲一名程序員,您只控制應用程序內的Windows *排序,而不是桌面上所有窗口的排序。 –

回答

-2

您應該使用CWnd :: wndTopMost而不是CWnd :: wndTop。 CWnd :: wndTopMost將使窗口保持最高,即使停用。

查看文檔: https://msdn.microsoft.com/en-us/library/a1yzfz6d.aspx

舊新事物的文章對兩者的區別: https://blogs.msdn.microsoft.com/oldnewthing/20051121-10/?p=33263

+0

最頂層固定在頂部的窗口中,所以在運行任何其他應用程序時,先前的窗口仍然存在,這是不可接受的。我想要的是,當我的應用程序啓動時,它應該在頂部並打開,但註冊對話框在後臺 –

+1

和另一個相關的舊新文章:[我如何創建一個永遠不會覆蓋的最上面的窗口其他最頂層窗口?(https://blogs.msdn.microsoft.com/oldnewthing/20110310-00/?p=11253/) –

+0

我想我誤解你的實際問題。 也許你可以在下次提供更多的細節在原始發佈,以避免混淆。 – Jonathan

4

我很抱歉,但你問是不是(平凡)成爲可能。您的窗口不在最前面的原因是因爲您的應用程序不是前臺應用程序(即 - 負責前臺窗口的應用程序)。

manual page

要使用SetWindowPos帶來了窗口頂端,即 擁有窗口必須SetForegroundWindow許可的過程。

當然,你做到了。但是,您沒有檢查其返回代碼。以下是man page必須說的內容:

系統限制哪些進程可以設置前臺窗口。甲 過程可以設置前景窗口只有在下列 條件之一爲真:

  • 過程是前臺進程。
  • 該過程由前臺進程啓動。
  • 該進程收到最後一個輸入事件。
  • 沒有前臺進程。
  • 該進程正在調試。
  • 前臺進程不是現代應用程序或開始屏幕。
  • 前景未鎖定(請參閱LockSetForegroundWindow)。
  • 前臺鎖定超時已過期(請參閱SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  • 沒有菜單處於活動狀態。

這些限制的總和是,在所有的可能性,你不能把你的窗口變成前景窗口,你不能把它前面。

有辦法解決這個問題。您可以確保前臺進程調用SetForegroundWindow。不幸的是,那不是你的代碼。

的一個時間,我必須這樣做,我爲了用hooks注入我的代碼到前臺窗口的進程。這不是初學者的伎倆。如果你不這樣做,那麼你無法做你想做的事情。

編輯爲: Windows試圖阻止你做你正在做的事情是有原因的。從另一個應用程序竊取焦點會爲用戶帶來非常糟糕的UI體驗。請重新考慮是否要做你正在嘗試做的。

+0

*「偷從另一個應用程序的重點爲用戶創建很差的UI體驗。」 * - 這不是爲什麼微軟改變行爲。他們這樣做,因爲輸入到前臺窗口,並且竊取前臺窗口意味着竊取你的密碼。此外,限制名單相當不準確,而且這種限制已經存在多年。如果它是正確的,那麼通過關閉所有菜單來設置前景窗口將非常簡單。 – IInspectable

+0

你在說MS爲什麼這麼做。你可能會也可能不會是正確的(畢竟,相同的鉤子技術也會盜取你的密碼)。我正在談論爲什麼你作爲用戶*不應該這樣做。你可以,但你仍然不應該。 –

相關問題