Окно показано в фоновом режиме - PullRequest
0 голосов
/ 30 мая 2011

У некоторых пользователей моего приложения некоторые Windows WPF будут отображаться за Shellwindow. Это происходит только в некоторых местах. Shellwindow не имеет установленного Topmost. Я надеюсь, что кто-то может дать мне совет, что я могу сделать, чтобы предотвратить это.

Спасибо.

С наилучшими пожеланиями, Томас

Ответы [ 2 ]

3 голосов
/ 31 мая 2011

Мне известны только три сценария, в которых одно из ваших окон может потерять фокус и исчезнуть за окном другого приложения:

  • программа, вызывающая SetForegroundWindow (), которую нужно отправитьодно из его окон на передний план.Windows имеет определенные контрмеры против этого, начиная с ~ Win98, преступления с пользовательским интерфейсом, которое совершалось слишком часто.Это разрешается только в том случае, если какое-то время не обнаруживались входные события в активном окне.В противном случае она будет мигать кнопкой на панели задач.Конечно, программисты нашли контрмеры.Версия Центра обновления Windows начала делать это примерно два года назад.К счастью, программист, который был ответственен за это, был выведен на улицу и расстрелян.

  • самопричиненный тип, вызванный на короткое время наличием нет ваших оконспособен получать фокус.Диспетчер окон Windows вынужден искать другое окно, на которое нужно обратить внимание.Это может быть «окном оболочки», что угодно.Это наиболее часто происходит при отображении диалогового окна и либо скрытии основного окна, либо отключении его самостоятельно.И снова показывать его, когда диалог закрыт.Это слишком поздно, есть доля секунды, когда ни одно окно не может получить фокус.Между прочим, это не повторяется, во всяком случае, потому что это зависит от того, какое другое окно может быть доступно.

  • отображение верхнего уровня не принадлежащего окна в потоке.Такое окно не может иметь отношения Z-порядка с другими окнами в вашем приложении и имеет только окно рабочего стола в качестве родительского.Где он конкурирует с любым другим окном, включая окна, принадлежащие Explorer.Показывать его поверх других окон - это чушь, которая обычно работает, но иногда нет.Особенно больно для пользователя, когда это окно сообщения.

2 голосов
/ 30 мая 2011

Вы можете установить Window.Owner вторичных окон для главного окна, чтобы избежать появления дочерних окон за основным окном. Я предполагаю, что это то, что вы подразумеваете под окном оболочки.

Вот некоторые последствия этого (из документации):

  • Если окно владельца свернуто, все его собственные окна также свернуты.
  • Если собственное окно свернуто, его владелец не свернуто.
  • Если окно владельца развернуто, восстанавливается как окно владельца, так и принадлежащие ему окна.
  • Окно владельца никогда не может закрывать собственное окно.
  • Собственные окна, которые не были открыты с помощью ShowDialog, не являются модальными. Пользователь по-прежнему может взаимодействовать с окном владельца.
  • Если вы закрываете окно владельца, его собственные окна также закрываются.
  • Если принадлежащее окно было открыто его владельцем с помощью Показать, а окно владельца закрыто, событие закрытия собственного окна не вызывается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...