如何在不重叠全屏窗口的情况下显示最顶层的窗口

我需要显示一个最上面的窗口(系统托盘中的气球),而不会重叠任何全屏窗口。 例如,如果用户观看电影时出现最顶端的窗口,则该窗口不得出现在电影屏幕的顶部。 该窗口只有在用户closures全屏窗口时才会出现。

现在,我只是这样展示我的窗口:

window.show() 

在我打开这些属性的风格:

 <Setter Property="Topmost" Value="True" /> <Setter Property="WindowStyle" Value="None" /> <Setter Property="ShowActivated" Value="False" /> 

如果他观看电影或玩游戏,您可以帮助弄清楚如何显示最顶层的窗口而不会打扰用户吗?

我不知道这个wpf的内置支持。 所以如果我必须实现这个,我会发现如果我的操作系统中的前台窗口全屏运行,那么不要以全屏模式启动我的窗口。

为了在操作系统中获得当前的前台窗口,我们需要导入一些User32函数

 [DllImport("user32.dll")] private static extern bool GetWindowRect(HandleRef hWnd, [In, Out] ref RECT rect); [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); [StructLayout(LayoutKind.Sequential)] private struct RECT { public int left; public int top; public int right; public int bottom; } 

现在我们需要添加对System.Windows.FormsSystem.Drawing引用来获取当前的Screen 。 如果ForegroundWindow以全屏模式运行,则函数返回如下。

  public bool IsAnyWindowFullScreen() { RECT rect = new RECT(); GetWindowRect(new HandleRef(null, GetForegroundWindow()), ref rect); return new System.Drawing.Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top).Contains(Screen.PrimaryScreen.Bounds); } 

所以,当启动我的窗口,我只是检查

  if(!IsAnyWindowFullScreen()) { window.Topmost = true; } window.Show(); 

非常非常的问题,我已经处理了类似的事情,恐怕你不能像你想的那样简单(纠正我,如果我错了,我很想知道)。

这是我将如何处理你的问题:

  1. 首先创建一个线程,计算出当前的前景窗口是否以全屏模式运行(再次,除了检查窗口大小是否大于或等于屏幕,除了检查之外没有其他的真实的方法)。 您可以使用这个: 如何检测另一个应用程序是否以全屏模式运行 。
  2. 如果线程注意到前景窗口改变(并且当前窗口不是全屏),则通过Dispatcher运行一个方法,设置Topmost = true