Ввод с клавиатуры и цикл сообщений Win32 - PullRequest
4 голосов
/ 14 марта 2010

Как мне обрабатывать нажатия клавиш и события нажатия клавиш в цикле сообщений Windows? Мне нужно иметь возможность вызывать две функции OnKeyUp(char c); и OnKeyDown(char c);.

Текущая литература, которую я нашел по поиску, привела меня в замешательство по поводу WM_CHAR или WM_KEYUP и WM_KEYDOWN и, как правило, ориентирована на КПК или управляемый код, тогда как я использую C ++.

Ответы [ 2 ]

11 голосов
/ 14 марта 2010

Типичный цикл сообщений C ++ выглядит следующим образом

MSG msg;
while (GetMessage(&msg, null, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Функция TranslateMessage - генерировать сообщения WM_CHAR из сообщений WM_KEYDOWN, поэтому, если вы хотите видеть сообщения WM_CHAR, вы должны обязательно передавать ему сообщения WM_KEYDOWN. Если вас не интересуют сообщения WM_CHAR, вы можете пропустить это и сделать что-то вроде этого.

extern void OnKeyDown(WPARAM key);
extern void OnKeyUp(WPARAM key);

MSG msg;
while (GetMessage(&msg, null, 0, 0))
{
    if (msg.message == WM_KEYDOWN)
       OnKeyDown (msg.wParam);
    else (msg.message == WM_KEYUP)
       OnKeyUp(msg.wParam);
    else
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }
}

Обратите внимание, что сообщения OnKeyDown и OnKeyUp определены как принимающие WPARAM, а не символ. Это связано с тем, что значения WM_KEYDOWN и WM_KEYUP не ограничиваются значениями, которые помещаются в символ. См. WM_KEYDOWN

7 голосов
/ 15 марта 2010

Используйте char c = MapVirtualKey(param,MAPVK_VK_TO_CHAR); для преобразования кодов виртуальных ключей в char и обработки WM_KEYUP и WM_KEYDOWN и их wParams.

if (PeekMessage (&mssg, hwnd, 0, 0, PM_REMOVE))
{
    switch (mssg.message)
    {
        case WM_QUIT:
            PostQuitMessage (0);
            notdone = false;
            quit = true;
            break;

        case WM_KEYDOWN:
            WPARAM param = mssg.wParam;
            char c = MapVirtualKey (param, MAPVK_VK_TO_CHAR);
            this->p->Input ()->Keyboard ()->Listeners ()->OnKeyDown (c);
            break;

        case WM_KEYUP:
            WPARAM param = mssg.wParam;
            char c = MapVirtualKey (param, MAPVK_VK_TO_CHAR);
            this->p->Input ()->Keyboard ()->Listeners ()->OnKeyUp (c);
            break;
    }
    // dispatch the message
    TranslateMessage (&mssg);
    DispatchMessage (&mssg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...