Как диалоговое окно Windows «Безопасное извлечение устройства» получает «любовь переднего плана»?

Рэймонд написал в блогео том, как программы могут получить/украсть «любовь переднего плана» с помощью RegisterHotkey, которая при вызове перенесет приоритет переднего плана в ваше приложение.

Попытки сделать это вручную терпят неудачу (например, с помощью SetForegroundWindow, SwitchToWindowи т. д.), потому что приложения не должны иметь возможность украсть фокус у пользователя (чтобы нажатия клавиш не лезь не туда).

Проблема в том, что сегодня я заметил нечто странное:

  1. Я пытаюсь безопасно удалить внешний диск.

  2. Пауза ~7 секунд.

  3. Во время паузыя энергично печатаю в окне.

  4. Внезапно окно сообщения крадетпередний план из моего приложения, и вместо этого я печатаю текст в окне сообщения.

Ясно, что здесь не используется механизм горячих клавиш, и тем не менее Windows смогла украсть фокус у моего приложения.

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

Итак, вопрос в том, как это достигается?

Примечание:

Ханс отметил, что "бэкдор" — это AttachInputThread, но я не очень уверен, что здесь происходит именно это, тем более что Рэймонд говорит, что этот метод может вызывать зависания. Идеи?

10
задан Mehrdad 8 July 2012 в 09:49
поделиться