Как обойти «тайм-аут блокировки переднего плана», чтобы активировать мое окно? - PullRequest
2 голосов
/ 28 марта 2012

Я пытаюсь создать приложение типа Launchy / Enso / etc., Которое появляется, когда пользователь нажимает клавишу Caps Lock.

Чтобы сделать это, мне нужно было установить низкоуровневый хук клавиатуры (WH_KEYBOARD_LL), из которого я впоследствии создал поток для отображения диалогового окна для представления пользователю.

Проблема в том, что когда я каким-то образом краду фокус (например, нажимая на другое окно) и затем нажимаю Caps Lock с небольшой задержкой, мое окно не получает ввод с клавиатуры: ввод идет в фоновое окно, хотя мое окно "активно" (от просмотра строки заголовка).

Конечно, это довольно раздражает, так как я в итоге набираю что-то вроде "visu" (для "Visual Studio") внутри текстового процессора (или окна чата ...) и нажимаю Войдите, понимая, что это не то, что я хотел.

(Забавно, что после 3-секундной (или около того) паузы строка заголовка моего окна внезапно становится "неактивной", даже если она вообще не была активной!)

Как мне обойти этот «защитный» механизм, чтобы на самом деле активировать мое окно?

1 Ответ

1 голос
/ 28 марта 2012

Хорошо, я наконец-то понял, как взломать. (Работодатели Microsoft: пожалуйста, отведите взгляд ...)

Я перехватываю Caps Lock с помощью низкоуровневой клавиатуры, затем, когда я обнаруживаю VK_CAPITAL, я звоню

keybd_event(
    VK_OEM_8,
    (BYTE)MapVirtualKey(pKBDLLHook->vkCode, MAPVK_VK_TO_VSC),
    (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) ? KEYEVENTF_KEYUP : 0,
    0
);

изнутри обработчика.

По сути, я просто изменяю запрос на VK_OEM_8.
Однако обратите внимание, что код виртуальной клавиши не соответствует коду сканирования. Это преднамеренно - VK_OEM_8 не не имеет кода сканирования (насколько я могу судить, во всяком случае), поэтому у меня не было особого выбора.

Тогда я просто программирую на основе VK_OEM_8 вместо этого - который легко перехватить / обработать / и т.д.

Надеюсь, это поможет другим людям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...