Windows 别再做最上面的窗户了
我的窗口应该位于我无法控制的特定“目标”窗口的顶部 当目标窗口被激活时,我用Windows 别再做最上面的窗户了,windows,winapi,window,topmost,Windows,Winapi,Window,Topmost,我的窗口应该位于我无法控制的特定“目标”窗口的顶部 当目标窗口被激活时,我用HWND\u topmest调用SetWindowPos将我的窗口放在它上面,而目标仍然可以是活动窗口 当目标窗口不再是前景窗口时,我希望我的窗口仍然位于目标窗口的顶部,但不再位于最顶部,这样其他窗口就不会被它覆盖 我有两个想法: 用hwninsertafter调用SetWindowPos,作为刚刚激活的窗口。当刚刚激活的窗口为最顶端时,此操作失败,因为我的窗口不会丢失最顶端的状态。另一个问题是:如果刚刚激活的窗口是桌
HWND\u topmest
调用SetWindowPos
将我的窗口放在它上面,而目标仍然可以是活动窗口
当目标窗口不再是前景窗口时,我希望我的窗口仍然位于目标窗口的顶部,但不再位于最顶部,这样其他窗口就不会被它覆盖
我有两个想法:
- 用
调用hwninsertafter
,作为刚刚激活的窗口。当刚刚激活的窗口为最顶端时,此操作失败,因为我的窗口不会丢失最顶端的状态。另一个问题是:如果刚刚激活的窗口是桌面,那么我的窗口就位于目标窗口的下方SetWindowPos
- 使用
调用HWND\u NOTOPMOST
,以丢失最顶层的状态。但是,这会使我的窗口位于所有非最上面的窗口的顶部,因此它会覆盖刚刚激活的窗口。要解决此问题,我必须使用另一个SetWindowPos
和SetWindowPos
将刚刚激活的窗口再次置于顶部。这感觉是错误的做法,可能会导致闪烁HWND\u top
有没有可能让一个窗口不再是最上面的,而是放在当前前景窗口的下面?无论目标窗口是否是最上面的,使一个窗口永久位于另一个窗口之上的唯一自动方法是所有者/所有者关系。您可以尝试使用
SetParent
创建此关系,但请注意
假设您正在以某种方式跟踪窗口激活,我认为您的SetWindowPos
想法(第一个)是实现这一点的方法,并进行了以下修改:
- 当目标窗口处于活动状态时,将窗口设置为
HWND\u topmest
- 当目标失去激活时,按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, ...);
}
最顶层是指所有其他未标记为最顶层的窗口的顶部。因此,如果没有其他窗口标记为最上面,则您的窗口将是最上面的。为什么不创建一个模态对话框呢?它将是最上面的,仅供您使用。@GaneshR。如前所述,我无法控制目标窗口。当我的窗口位于顶部时,目标窗口也应该处于活动状态。谢谢,这非常有效。还包括两个窗口突然到达z顺序顶部的情况。在我的方法中,我的窗口将在这两者之间。