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>
Теперь, что странно, когда вы скомпилируете и запустите это окно, выполните следующие действия:
- Нажмите на Показать рабочий стол, чтобы скрыть все приложения
- Alt+Tab обратно в тестовое приложение WPF
- Щелкните за пределами области "Голубая граница" (в рабочую область рабочего стола)
- Наблюдайте, как WPF Test App волшебным образом исчезает
- При желании 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. Такое поведение сохраняется независимо от настроек окна.