我有一个“控制工具栏”应用程序,需要浮动在其他所有的主屏幕上的双重监控系统。它将自己定位在主屏幕的顶部,并设置TopMost=true。
此控制工具栏可用于启动其他两个进程,它们运行全屏,但不运行TopMost,在双监视器系统中每个监视器上都有一个进程。设置这些窗口是为了运行全屏,方法是将BorderStyle设置为None,并设置窗口的边界以完全符合屏幕尺寸。全屏窗口覆盖任务栏没有问题,我可以整天在主监视器上与全屏窗口进行聚焦和交互,工具栏保持在顶部。
然而,在软件王国中,并非所有的事情都是令人愉快的--某些操作使TopMost工具栏在非顶部的全屏窗口下弹出。其中一个动作是将焦点放在辅助监视器上的全屏应用程序上,然后将焦点放回主监视器上的全屏应用程序。这是最容易复制的情况,因为每次我遵循这个序列时都会发生这种情况。我很难可靠地复制其他场景,但如果我按下windows键,在Internet中打开“开始”菜单并开始浏览,有时当我完成浏览和关闭IE,并将焦点放回主监视器全屏应用程序时,它就会弹出TopMost窗口。
是否知道如何将TopMost窗口保持在顶部,而不允许它弹出非顶部的全屏窗口?我不介意每秒钟做一次轮询WindowFromPoint来查看工具栏是否还在顶部,如果没有,就以某种方式弹出它,但是如果用户正在使用这个全屏应用程序,我不想将注意力从这个应用程序中移开,所以Activate()不是一个特别好的解决方案。
我不认为这真的重要,但工具栏是一个WPF窗口,全屏幕应用程序是WinForms。
更新:
测试这一点的最简单方法是按F11键在每个监视器上的两个浏览器窗口中运行全屏,以模拟全屏应用程序,然后在任何地方都有一个TopMost窗口浮动。在两个全屏窗口之间单击,您将看到TopMost窗口在它们下面弹出。我在一个显示器上打开IE,在另一个显示器上打开Chrome,因为IE不允许我做两个全屏窗口。
我现在实现了Activate() hack,但这是一个相当难看的解决方案,因为它激活了工具栏应用程序,它使全屏应用程序失去了焦点,从而使任务栏弹出了全屏应用程序。当你想要做的只是切换哪个全屏应用程序有焦点的时候,你就有点烦躁了。
发布于 2013-04-26 01:30:17
好吧,这是我最后做的.在我打算放弃之前,我又想出了一个主意,而且效果很好。在工具栏窗口中,我有一个计时器,它每秒钟在工具栏区域上轮询最上面的窗口一次,如下所示:
var topMostHandle = WindowFromPoint((int)(Left + ActualWidth / 2), (int)ActualHeight / 2);
if (topMostHandle != new WindowInteropHelper(this).Handle)
{
Topmost = false;
Topmost = true;
}基本上,我只需在工具栏中间取一点,然后测试工具栏是否在顶部。如果没有,我将TopMost设置为false,并将其设置为true,这似乎会使其恢复到顶部,而不会激活它。闪光灯消失一秒钟是有点烦人,但我不希望这种情况经常发生。
感谢汉斯·帕桑特为Win7 SP1找到了解决问题的修补程序:http://support.microsoft.com/kb/2733420
我将我的黑客代码保存在代码中,以防客户端不能/不运行该修补程序作为解决办法。
https://stackoverflow.com/questions/16227034
复制相似问题