2015-07-11 26 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

相关问题