Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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
C# 如何将窗口置于另一个窗口之上?_C#_Winforms_Winapi - Fatal编程技术网

C# 如何将窗口置于另一个窗口之上?

C# 如何将窗口置于另一个窗口之上?,c#,winforms,winapi,C#,Winforms,Winapi,我正在编写一个自定义工具提示窗口(我们称之为一个窗口)。它必须显示在另一个窗口上(我们称之为B),并且: 不要从B中窃取焦点 当用户继续输入B时,不要将其在z顺序中的位置丢失到B 必须接收WM_NCHITTEST消息(我使用它们在非活动窗口上跟踪鼠标位置) 当另一个窗口被带到B上时,它也必须被带到A上;应避免B被覆盖且不可见,但A被显示的情况 我试图通过使用SetWindowPos函数来实现这一点,从B调用它的包装器(在A中定义),如下所示: public void SetLocat

我正在编写一个自定义工具提示窗口(我们称之为一个窗口)。它必须显示在另一个窗口上(我们称之为B),并且:

  • 不要从B中窃取焦点

  • 当用户继续输入B时,不要将其在z顺序中的位置丢失到B

  • 必须接收WM_NCHITTEST消息(我使用它们在非活动窗口上跟踪鼠标位置)

  • 当另一个窗口被带到B上时,它也必须被带到A上;应避免B被覆盖且不可见,但A被显示的情况

我试图通过使用SetWindowPos函数来实现这一点,从B调用它的包装器(在A中定义),如下所示:

    public void SetLocation(Point location, IntPtr UnderHandle)
    {
        SetWindowPos(Handle, HWND_TOPMOST, location.X, location.Y, Width, Height,
                             SetWindowPosFlags.DoNotActivate);

    }
(来自pinvoke.net的SetWindowPosFlags)

结果几乎满足了我所有的需要,除了第一个

我也尝试过什么:

  • HWND_TOP:不会将窗口A置于活动窗口B之上;更准确地说:在调用之后,它会立即将窗口A移到前台,但随后B移到前台;实际上,当标题栏移动B并按下鼠标按钮时,窗口A被画在标题栏上,但当鼠标按钮未按下时,窗口A就在标题栏下

  • 使用UnderHandle作为第一个参数,Handle作为第二个参数调用SetWindowPos,尝试“将窗口B置于窗口A之下”会产生相同的结果


SetWindowPos应如何正确设置以达到预期的结果?或者,如何监控窗口B在zorder中的位置,以迫使窗口A位于其旁边(从前景窗口开始)?

显然
HWND\u最顶部的
是您的问题,您当然不能这样做。您可以使用
HWND\u TOP
,但接下来的挑战是如何将窗口A保持在窗口B的顶部。实现这一点的方法是通过B使A成为B

自有窗口

重叠窗口或弹出窗口可归其他窗口所有 重叠或弹出窗口。被拥有会给你带来一些限制 窗户

  • 拥有的窗口在z顺序中始终高于其所有者
  • 当所有者为时,系统会自动销毁其拥有的窗口 毁灭
  • 当所有者最小化时,拥有的窗口将隐藏
只有 重叠或弹出窗口可以是所有者窗口;儿童窗 不能是所有者窗口。应用程序创建一个所有者拥有的窗口 将所有者的窗口句柄指定为的hwndParent参数
CreateWindowEx
当它创建一个与
WS\u重叠的窗口时
WS\u弹出窗口
style。hwndParent参数必须标识重叠的 或弹出窗口。如果hwndParent标识子窗口,则系统 将所有权分配给子窗口的顶级父窗口。 创建自有窗口后,应用程序无法传输 将窗口的所有权转移到另一个窗口


事实上,从上面的第一个要点可以看出,一旦正确设置了所有权,就不需要
HWND\u TOP

谢谢!按照你的建议,我设置了A.Owner=B,并得到了我想要的。