2013-11-18 2 views
25

Возможно ли, чтобы окно оставалось всегда сверху, даже когда другое приложение работает на Fullscreen? Я использую прямо сейчас TopMost = true, но когда другое приложение работает в полноэкранном режиме, мой вид становится невидимым. Это WindowStyle = None Окно, кстати.WPF Always On Top

Edit: И не позволяй другое окно

конечно сводится на минимум
+3

В каком приложении работает полноэкранный режим? Существует большая разница между максимизированным окном (например, веб-браузером) и приложением, которое действительно захватывает дисплей (как и большинство видеоигр по умолчанию) – Flater

+1

Это зависит от того, как ** они ** реализовали полноэкранную функцию (открыли ли они DC для отображения они просто ставят собственное окно сверху, максимально и без границ?). Конечно, вы всегда можете обрабатывать изменения в собственном окне **, чтобы реагировать соответствующим образом (например, восстанавливая видимое состояние). –

+0

Вы можете найти [это] (http://stackoverflow.com/questions/7434638/force-window-to-be-above-already-top-most-windows-like-the-task-manager) и [это] (http://stackoverflow.com/questions/3066082/how-to-keep-my-topmost-window-on-top) интересно, они предназначены для C++, но комментарии актуальны. – JMK

ответ

31

Это не будет работать 100% времени, но это улучшит ситуацию несколько. Вы можете установить Topmost = true в обработчик для Window.Deactivated события:

private void Window_Deactivated(object sender, EventArgs e) 
{ 
    Window window = (Window)sender; 
    window.Topmost = true; 
} 

Deactivated события будет вызываться всякий раз, когда приложение теряет фокус (часто, когда другое приложение запрашивает быть Topmost) и таким образом, это приведет к сбросу приложению на вершине после это.

+1

Не работает так, как хотелось бы, но спасибо. –

+1

Это отлично сработало для меня –

+0

и что произойдет, если два приложения попытаются это сделать ... – Steve

7

Попробуйте это решение из MSDN, оно должно работать на вас. В Window Activated Event добавить следующий код:

this.Width = System.Windows.SystemParameters.PrimaryScreenWidth; 
this.Height = System.Windows.SystemParameters.PrimaryScreenHeight; 
this.Topmost = true; 
this.Top = 0; 
this.Left=0; 

в DeActivated Event добавить следующий код

this.Topmost = true; 
this.Activate(); 

Original post from MSDN

1

Я имел главное окно, что я хотел, чтобы держать на вершине все (если пользователь проверял «всегда сверху».
Это сработало для меня. Надеюсь, это поможет кому-то.

 // If we want main to stay on top, we set the rest of the menus to Not be top 
     if (mnuViewMainWindowAlwaysOnTopo.IsChecked) 
     { 
      this.Topmost = true; 
      foreach (Window window in Application.Current.Windows) 
      { 
       // Don't change for main window 
       if (window.GetType().Name != this.GetType().Name) 
       { 
        window.Topmost = false; 
       } 
      } 
     } 
     else 
     { 
      this.Topmost = false; 
     } 
2

Если вы хотите, чтобы ваше приложение оставалось на вершине ВСЕГО (включая начальный интерфейс в Windows 8, ранее известный как «Метро»), вы можете указать UiAccess = «True» в вашем файле манифеста. Это обычно используется приложениями доступности, такими как экранные клавиатуры.

Из памяти вам нужно сделать 3 вещи;

  1. Запрос UIAccess = "True"
  2. Вход исполняемый файл вашего приложения с признанным сертификатом. Я получил бесплатный сертификат подписи кода от Certum, так как моим проектом является Open Source.
  3. Установите приложение в «Доверенное местоположение», которое в моем случае было каталогом файлов программ. Официального определения «Доверенное местоположение» я не могу найти.