Win7 WPF Alt + Tab Focus Oddity - PullRequest
       25

Win7 WPF Alt + Tab Focus Oddity

2 голосов
/ 18 декабря 2009

После пары часов поиска в 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 магически исчезает
  5. По выбору Alt + Tab для любого другого работающего приложения и наблюдайте, как волшебное приложение WPF Test снова появляется

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

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

1 Ответ

1 голос
/ 19 декабря 2009

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

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

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


EDIT: Несмотря на это, похоже, что это просто ошибка в WPF и Windows 7. Такое поведение сохраняется независимо от настроек окна.

...