2012-03-28 8 views
2

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

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

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

Конечно, это становится очень раздражает, так как я тогда в конечном итоге, набрав что-то вроде «Visu» (для «Visual Studio») внутри текстового процессора (или окно чата ...) и нажимной Enter, withotu понимая, что он не делает то, что я намеревался.

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

Как я могу обойти этот механизм защиты до фактически активировать мое окно?

+0

Raymond Chen покрыл это на Old New Thing ... вам нужно использовать функцию горячих клавиш оболочки вместо того, чтобы пытаться украсть фокус. –

+0

@BenVoigt: Как мне сделать это с помощью Caps Lock при подавлении ввода? – Mehrdad

+1

Я предлагаю вам начать с чтения всей серии «гонки вооружений» Раймонда. [Вот тот, о котором я уже упоминал] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/26/9445006.aspx). –

ответ

1

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

I перехватывают 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 - это легко перехватить/обработать/и т. Д.

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

 Смежные вопросы

  • Нет связанных вопросов^_^