Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 别再做最上面的窗户了_Windows_Winapi_Window_Topmost - Fatal编程技术网

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顺序在目标窗口的前一个窗口后插入窗口(即,实际上仍然在目标窗口的顶部,但不是最顶部)
类似于以下psuedo代码:

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顺序顶部的情况。在我的方法中,我的窗口将在这两者之间。