2015-07-11 28 views
1

我的窗口應該位於我無法控制的特定「目標」窗口的頂部。停止作爲最上方的窗口

當目標窗口被激活時,我呼叫SetWindowPosHWND_TOPMOST將我的窗口置於其上,而目標仍然可以是活動窗口。

當目標窗口不再是前景窗口時,我希望我的窗口仍然位於目標窗口的頂部,但不再是最頂層的,所以其他窗口不會覆蓋它。

兩個想法我有:

  • 呼叫SetWindowPoshWndInsertAfter是剛剛激活的窗口。當剛激活的窗口是最頂層的時候,這會失敗,因爲我的窗口不會丟失最高層的狀態。與此相關的另一個問題:如果剛激活的窗口是桌面,那麼我的窗口放置在目標窗口下方。

  • 致電SetWindowPosHWND_NOTOPMOST失去最高地位。但是,這將我的窗口帶到了所有非最頂層窗口的頂部,因此它覆蓋了剛剛激活的窗口。爲了解決這個問題,我必須再次將剛剛激活的窗口與另一個SetWindowPosHWND_TOP一起。這感覺就像做錯了一樣,可能會導致閃爍。

是否有可能有一個窗口只是停在最頂層,並將其放置在當前的前臺窗口下方?

+0

朵蒙特手段。所以如果沒有其他窗口被標記爲最上面,那麼你的窗口將會是最上面的。爲什麼不創建模態對話框?它只會用於您的應用程序。 –

+0

@ GaneshR。如上所述,我無法控制目標窗口。目標窗口也應該是活動的,而我的窗口在上面。 – typ1232

回答

3

無論目標窗口是否是最頂層,唯一自動將窗口永久置於另一個窗口之上的方法是擁有者/擁有者關係。你可以嘗試使用SetParent創建這種關係,但請注意Raymond Chen does say it's not recommended

假設你以某種方式跟蹤窗口激活,我覺得你的想法SetWindowPos(第一個)是做到這一點,有以下修改方式:

  • 當目標窗口處於活動狀態,請將您的窗口HWND_TOPMOST
  • 當目標失去激活,插入你的窗口目標窗口在Z順序的前任之後(即有效地仍然在目標窗口的頂部,但不是最頂層)

事情是這樣的僞代碼:對未標記爲朵蒙特所有其他窗口的頂部

if (foregroundwindow == targetwindow) 
    SetWindowPos(my_window, HWND_TOPMOST, ...); 
else 
{ 
    HWND hwndPred = GetWindow(targetwindow, GW_HWNDPREV); 
    if (!hwndPred) 
    { 
     // no predecessor so my_window will still be on top, just not top-most any more 
     if (GetWindowLong(targetwindow, GWL_EXSTYLE) & WS_EX_TOPMOST) 
      hwndPred = HWND_NOTOPMOST; 
    } 
    SetWindowPos(my_window, hwndPred, ...); 
} 
+0

謝謝,這真的很好。還涵蓋了兩個窗口突然出現在z順序頂部的情況。在我的方法中,我的窗口將介於這兩者之間。 – typ1232

相關問題