我正在编写一个自定义的工具提示窗口(我们称之为A)。它必须显示在另一个窗口(我们称之为B)上,并且需要满足以下条件:
不要从B窗口中夺取焦点
当用户继续在B窗口输入时,不要让A窗口在z-order中失去其位置
A窗口必须接收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被绘制在其上方 - 但是在释放鼠标按钮时就会变成下层
尝试使用UnderHandle作为第一个参数,Handle作为第二个参数调用SetWindowPos,以尝试“将窗口B置于窗口A之下”会得到相同的结果
如何正确使用SetWindowPos以达到所需的结果 - 或者,另一种方法是如何监视窗口B在zorder中的位置,以强制将窗口A从前景窗口移动到其旁边?