首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TopMost窗口有时会出现在非顶部的全屏窗口后面。

问TopMost窗口有时会出现在非顶部的全屏窗口后面。
EN

Stack Overflow用户
提问于 2013-04-26 00:47:40
回答 1查看 2.3K关注 0票数 2

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

此控制工具栏可用于启动其他两个进程,它们运行全屏,但不运行TopMost,在双监视器系统中每个监视器上都有一个进程。设置这些窗口是为了运行全屏,方法是将BorderStyle设置为None,并设置窗口的边界以完全符合屏幕尺寸。全屏窗口覆盖任务栏没有问题,我可以整天在主监视器上与全屏窗口进行聚焦和交互,工具栏保持在顶部。

然而,在软件王国中,并非所有的事情都是令人愉快的--某些操作使TopMost工具栏在非顶部的全屏窗口下弹出。其中一个动作是将焦点放在辅助监视器上的全屏应用程序上,然后将焦点放回主监视器上的全屏应用程序。这是最容易复制的情况,因为每次我遵循这个序列时都会发生这种情况。我很难可靠地复制其他场景,但如果我按下windows键,在Internet中打开“开始”菜单并开始浏览,有时当我完成浏览和关闭IE,并将焦点放回主监视器全屏应用程序时,它就会弹出TopMost窗口。

是否知道如何将TopMost窗口保持在顶部,而不允许它弹出非顶部的全屏窗口?我不介意每秒钟做一次轮询WindowFromPoint来查看工具栏是否还在顶部,如果没有,就以某种方式弹出它,但是如果用户正在使用这个全屏应用程序,我不想将注意力从这个应用程序中移开,所以Activate()不是一个特别好的解决方案。

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

更新:

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

我现在实现了Activate() hack,但这是一个相当难看的解决方案,因为它激活了工具栏应用程序,它使全屏应用程序失去了焦点,从而使任务栏弹出了全屏应用程序。当你想要做的只是切换哪个全屏应用程序有焦点的时候,你就有点烦躁了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-26 01:30:17

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

代码语言:javascript
复制
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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16227034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档