gpt4 book ai didi

c# - TopMost 窗口有时会落后于非 TopMost 全屏窗口

转载 作者:行者123 更新时间:2023-12-04 05:00:17 24 4
gpt4 key购买 nike

我有一个“控制工具栏”应用程序,它需要 float 在双显示器系统主屏幕上的所有其他内容之上。它将自己定位在主屏幕的顶部并设置 TopMost=true。

此控制工具栏可用于启动其他两个全屏运行但不是 TopMost 的进程,在双显示器系统的每个显示器上运行一个。通过将 BorderStyle 设置为 None 并将窗口的边界设置为完全适合屏幕尺寸,这些窗口被设置为全屏运行。全屏窗口覆盖任务栏没有问题,我可以整天关注主显示器上的全屏窗口并与之交互,工具栏保持在顶部。

然而,在软件王国中并非万事如意——某些操作会使 TopMost 工具栏在非 TopMost 全屏窗口下弹出。其中一项操作是将焦点放在辅助显示器上的全屏应用程序上,然后将焦点返回给主显示器上的全屏应用程序。这是最容易重现的情况,因为每次我按照这个顺序都会发生。我很难可靠地再现其他场景,但是如果我按下 Windows 键来调出开始菜单并开始在 Internet Explorer 中浏览,有时当我完成浏览并关闭 IE 并将焦点返回到主监视器全屏应用程序时弹出 TopMost 窗口。

知道如何将 TopMost 窗口保持在顶部,并且不允许它在非 TopMost 全屏窗口下弹出吗?我不介意每秒轮询一次 WindowFromPoint 以查看工具栏是否仍在顶部,如果不是,则以某种方式将其弹回,但我不想将注意力从全屏应用程序上移开,如果那是用户正在使用,因此 Activate() 不是一个特别好的解决方案。

我认为这并不重要,但工具栏是 WPF 窗口,全屏应用程序是 WinForms。

更新:

测试这个最简单的方法是按 F11 在每个显示器上的两个浏览器窗口中全屏显示以模拟全屏应用程序,然后在任何地方 float 一个 TopMost 窗口。在两个全屏窗口之间单击,您将看到 TopMost 窗口在它们下方弹出。我在一台显示器上打开 IE,在另一台显示器上打开 Chrome,因为 IE 不允许我做两个全屏窗口。

我现在实现了 Activate() hack,但它是一个相当丑陋的解决方案,因为它激活了工具栏应用程序,使全屏应用程序失去焦点,这反过来又使任务栏在全屏应用程序上弹出。当您想要做的只是切换哪个全屏应用程序具有焦点时,这有点麻烦。

最佳答案

好的,这就是我最终要做的……在我打算放弃之前,我又想出了一个主意,而且效果很好。在工具栏窗口中,我有一个计时器,它每秒轮询一次工具栏区域上最顶部的窗口,如下所示:

var topMostHandle = WindowFromPoint((int)(Left + ActualWidth / 2), (int)ActualHeight / 2);

if (topMostHandle != new WindowInteropHelper(this).Handle)
{
Topmost = false;
Topmost = true;
}

所以我基本上只是在工具栏中间取一个点并测试看看工具栏是否在顶部。如果没有,我将 TopMost 设置为 false 并返回到 true,这似乎在不激活它的情况下将其重新置于首位。它消失一秒钟的闪光有点烦人,但我不希望这种情况经常发生。

感谢 Hans Passant 为 Win7 SP1 找到了解决该问题的修补程序: http://support.microsoft.com/kb/2733420

我将我的 hack 保留在代码中,以防客户端不能/不运行修补程序作为解决方法。

关于c# - TopMost 窗口有时会落后于非 TopMost 全屏窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16227034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com