Как показать самое верхнее окно, не перекрывая полноэкранные окна

Мне нужно показать самое верхнее окно (всплывающее окно из системного трея), не перекрывая полноэкранные окна. Например, если мое самое верхнее окно появляется, когда пользователь смотрит фильм, это окно не должно появляться в верхней части экрана фильма. Окно должно появляться только тогда, когда пользователь закрывает свое полноэкранное окно.

Теперь я просто показываю свое окно следующим образом:

window.show()

В стиле я включаю эти свойства:

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

Не могли бы вы помочь выяснить, как показать самое верхнее окно, не мешая пользователю, если он смотрит фильм или играет в игру?

2 ответа

Я не знаю какой-либо встроенной поддержки для этого wpf. Поэтому, если мне нужно реализовать это, я бы обнаружил, что окно Foreground в моей ОС работает в полноэкранном режиме, а затем не запускаю мое окно в полноэкранном режиме.

Чтобы получить текущее окно Foreground в ОС, нам нужно будет импортировать некоторые функции 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.Forms а также System.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
Другие вопросы по тегам