4

我需要显示一个最上面的窗口(系统托盘中的一个气球)而不重叠任何全屏窗口。例如,如果用户观看电影时出现我的最顶层窗口,则该窗口不能出现在电影屏幕的顶部。该窗口必须仅在用户关闭其全屏窗口时出现。

现在,我只是以这种方式显示我的窗口:

window.show()

在样式中,我打开了这些属性:

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

如果用户看电影或玩游戏,您能否帮助弄清楚如何在不打扰用户的情况下显示最顶层的窗口?

4

2 回答 2

1

我不知道对此 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();
于 2014-06-25T10:34:21.120 回答
0

相当不寻常的问题,我以前处理过类似的事情,恐怕你不能像你希望的那样简单(如果我错了,请纠正我,我很想知道)。

这就是我处理您的问题的方式:

  1. 首先创建一个线程来确定当前前台窗口是否在全屏模式下运行(同样,除了检查窗口大小是否大于或等于屏幕之外,没有真正的方法可以知道)。您可以使用:如何检测另一个应用程序是否以全屏模式运行
  2. 如果线程注意到前台窗口发生变化(并且当前窗口不在全屏状态),则设置运行一个方法Dispatcher,该方法将设置Topmost = true
于 2014-06-25T10:52:20.073 回答