Skip to content

7 Февраль 2012

178

Правильный WM_KEYDOWN

WM_KEYDOWN

Итак, необходимо отправить сообщение нажатия клавиши (WM_KEYDOWN) окну. В сети много примеров по этому поводу, они все вроде как рабочие, но тема все-равно остается не раскрыта. Как же все-таки посылать сообщения, чтобы они были полностью валидны?

:!:  Код

Для начала, необходимо найти окно, в которое будут передаваться нажатия (события WM_KEYDOWN).  Например у нас есть код:

            HWND focusWindow = GetFocus();
            sendKey(focusWindow, character);

Функция sendKey должна выглядеть следующим образом:

    LPARAM lParam;
    int ScanCode = MapVirtualKey(character, 0);
    lParam = ScanCode << 16;
    lParam |= 1;
    PostMessage(focusWindow, WM_KEYDOWN, character, lParam);

    // WM_KEYUP send automatically

:!:  Немного пояснений

Для точного соответствия lParam с событиями клавиатуры, использовалась стандартная софтина Spy++, входящая в состав Visual Studio. Переменная character (тип short) — задана заранее и содержит код символа. WM_KEYUP, вопреки разным мнениям в сети, посылать не нужно, она посылается автоматически.

:!:  В заключение

Если вы пишите нечто схожее с виртуальной клавиатурой (фокус при этом будет на окне виртуальной клавиатуры, а события должны приходить в окно настоящего фокуса) — посмотрите в сторону этих WinAPI функций:

AttachThreadInput()
SetFocus()
Еще из рубрики C/C++, Разработка ПО

Обсуждение закрыто.