将一个窗口置于另一个窗口之上

Posted

技术标签:

【中文标题】将一个窗口置于另一个窗口之上【英文标题】:Keep a window on top of another window 【发布时间】:2012-05-04 22:01:58 【问题描述】:

在问我的问题之前,让我说我已经在这里和其他论坛上阅读了大约 30 个主题,但没有一个解决方案对我有用:(

所以,事情就是这样。我正在为在线扑克室制作 Hud。因此,我的程序需要在扑克室创建的每个窗口顶部显示一个表格。

问题是,如果我想堆叠多个“桌面窗口”(扑克应用程序创建的窗口),如果我的 hud 设置为最顶部,那么所有桌子的顶部都有所有 hud,但我会like is to have in the z-order is Hud-Table-Hud-Table-Hu...等等。

我已经尝试了几种使用 windows 窗体函数和 windows api 的方法:

this.SetDesktopLocation(rct.Left + p.X, rct.Top + p.Y);

//Or     

Win32Utils.SetParent(this.Handle, this.Table.Handle);

//Or

Win32Utils.SetWindowPos(this.Handle, (int)this.Table.Handle, rct.Left + p.X, rct.Top + p.Y, this.Width, this.Height, (int)1);

//Or

Win32Utils.SetZOrder(this.Handle, this.Table.Handle);

如果是 SetZOrder,代码如下:

    public static void SetZOrder(IntPtr targetHwnd, IntPtr insertAfter)
    
        IntPtr nextHwnd = IntPtr.Zero;

        SetWindowPos(targetHwnd, insertAfter, 0, 0, 0, 0, SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOACTIVATE);
    

所以我不知道还能尝试什么。

注意:如果我使用 SetParent,扑克应用程序会冻结。

一张图片。我的应用是底部的窗口,在扑克应用窗口的左上角创建小窗体:

【问题讨论】:

什么是平视显示器?用户是与顶部表单交互还是只是装饰性的?如果用户抓住标题栏并移动它,这两个表单是否应该一起移动?图片可能会有所帮助。 HUD=抬头显示器,是吗?扑克应用程序是您可以控制的,还是您使用 api 调用将您的 hud 附加到桌面窗口的原因? HUD=抬头显示器,对。回家后我会贴几张图片,但与此同时: LarsTech:“HUD”表单显示信息并显示工具提示,因此它必须能够响应鼠标输入。是的,他们应该一起移动。目前,我通过设置一个计时器并在每个计时器滴答声中重新定位我的表单来做到这一点。 roken:我无法控制扑克应用程序。我只是根据一些日志文件显示信息。我使用 api 调用来了解创建窗口的时间,然后创建并定位我的 HUD。 在 Stack Overflow 上,将“@”符号放在用户名前,让该用户从评论中收到通知消息。 @LarsTech 编辑添加图片;) 【参考方案1】:

我认为你可以通过将 hud 表单的父级设置为 table 表单来获得你想要的。类似的东西

[STAThread]
static void Main()

    const int numWindows = 3;
    for (int i = 0; i < numWindows; i++)
    
        var tableForm = new Form  Text = @"Table " + i, Size = new Size(400, 400) ;
        tableForm.Show();

        var hudForm = new Form  Text = @"Hud " + i, Size = new Size(100,100) ;
        hudForm.Show(tableForm);
    

    var rootForm = new Form();
    Application.Run(rootForm);

【讨论】:

表格表格不是我的,所以我不能这样做。无论如何,使用 Windows api 中的 SetParent 会使主机应用程序冻结:S

以上是关于将一个窗口置于另一个窗口之上的主要内容,如果未能解决你的问题,请参考以下文章

MainWindowHandle 为 0 时将窗口置于前台

恢复另一个应用程序的最小化窗口

将子视图置于一切之上,但低于另一个 UIView

WPF将窗口置于桌面下方(可用于动态桌面)

如何将 PyQt QProcess 窗口置于前面?

从 Access 将 Excel 窗口置于前台