C# 如何将窗口置于另一个窗口之上?
我正在编写一个自定义工具提示窗口(我们称之为一个窗口)。它必须显示在另一个窗口上(我们称之为B),并且: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时,不要将其在z顺序中的位置丢失到B
- 必须接收WM_NCHITTEST消息(我使用它们在非活动窗口上跟踪鼠标位置)
- 当另一个窗口被带到B上时,它也必须被带到A上;应避免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顺序中始终高于其所有者
- 当所有者为时,系统会自动销毁其拥有的窗口 毁灭
- 当所有者最小化时,拥有的窗口将隐藏
CreateWindowEx
当它创建一个与WS\u重叠的窗口时
或
WS\u弹出窗口
style。hwndParent参数必须标识重叠的
或弹出窗口。如果hwndParent标识子窗口,则系统
将所有权分配给子窗口的顶级父窗口。
创建自有窗口后,应用程序无法传输
将窗口的所有权转移到另一个窗口
事实上,从上面的第一个要点可以看出,一旦正确设置了所有权,就不需要
HWND\u TOP
谢谢!按照你的建议,我设置了A.Owner=B,并得到了我想要的。