- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个“控制工具栏”应用程序,它需要 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;
}
关于c# - TopMost 窗口有时会落后于非 TopMost 全屏窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16227034/
我是一名优秀的程序员,十分优秀!