Win7 WPF Alt+Tab Focus Oddity

После пары часов поиска в Google мне не удалось найти никаких комментариев по этому вопросу. У нас есть WindowStyle=None окно с прозрачным фоном и позволяет прозрачность и не отображается на панели задач, все довольно нормально. Вот XAML, чтобы вы могли проверить себя:

<Window x:Class="AltTabTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="TestWindow" Title="TestWindow"
WindowStyle="None" AllowsTransparency="True" ResizeMode="NoResize" 
Background="Transparent" ShowInTaskbar="False"
Width="816" Height="820">

<Grid>
    <Border BorderThickness="0" Background="LightBlue" CornerRadius="15" />
</Grid>

Теперь, что странно, когда вы скомпилируете и запустите это окно, выполните следующие действия:

  1. Нажмите на Показать рабочий стол, чтобы скрыть все приложения
  2. Alt+Tab обратно в тестовое приложение WPF
  3. Щелкните за пределами области "Голубая граница" (в рабочую область рабочего стола)
  4. Наблюдайте, как WPF Test App волшебным образом исчезает
  5. При желании Alt+Tab к любому другому работающему приложению, и волшебное появление WPF Test App.

Итак, мой вопрос: какого черта здесь происходит?! Это ожидаемое поведение? Если так, есть ли способ обойти это?

Такое ощущение, что приложение WPF не получает фокуса после разрешения Alt+Tab. Обратите внимание, что это тестируется в Windows 7, и у меня не было возможности проверить это в Vista или XP. Мне бы хотелось, чтобы приложение действительно фокусировалось, но если это невозможно, мне интересно, есть ли способ перехватывать и игнорировать действия Alt+Tab. Приложение, которое планируется исправить, является приложением в режиме блокировки, поэтому пользователи никогда не смогут по-настоящему избавиться от его работы на рабочем столе. Спасибо за любые советы, примеры, понимание или указание в правильном направлении, спасибо! знак равно

1 ответ

Согласно Spy++ проблема состоит в том, что окно, когда установлено WindowStyle="None", больше не получает сообщение WM_ACTIVATE, когда вы alt-tab к нему. Параметр AllowsTransparency="True" отключает проверку попадания для окна, поэтому при щелчке за синим прямоугольником единственное значение HitTest, возвращающее значение true, - это значение рабочего стола.

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

Я не знаю, почему в Win7 окно не получает сообщение WM_ACTIVATE, хотя.


РЕДАКТИРОВАТЬ: не имеет значения, похоже, что это просто ошибка в WPF и Windows 7. Такое поведение сохраняется независимо от настроек окна.

Другие вопросы по тегам