Keyboard Input & the Win32 message loop

前端 未结 2 1377
春和景丽
春和景丽 2020-11-28 11:09

How do I handle key presses and key up events in the windows message loop? I need to be able to call two functions OnKeyUp(char c); and OnKeyDown(char c);

相关标签:
2条回答
  • 2020-11-28 11:21

    Use char c = MapVirtualKey(param,MAPVK_VK_TO_CHAR); to convert virtual key codes to char, and process WM_KEYUP and WM_KEYDOWN and their 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);
    }
    
    0 讨论(0)
  • 2020-11-28 11:33

    A typical C++ message loop looks like this

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

    The function of TranslateMessage is to generate WM_CHAR messages from WM_KEYDOWN messages, so if you want to see WM_CHAR messages you need to be sure to pass WM_KEYDOWN messages to it. If you don't care about WM_CHAR messages, you can skip that, and do something like this.

    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 if (msg.message == WM_KEYUP)
           OnKeyUp(msg.wParam);
        else
        {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
        }
    }
    

    Notice that OnKeyDown and OnKeyUp messages are defined as taking a WPARAM rather than a char. That's because the values for WM_KEYDOWN and WM_KEYUP aren't limited to values that fit in a char. See WM_KEYDOWN

    More:
    Using Messages and Message Queues
    https://docs.microsoft.com/en-us/windows/win32/winmsg/using-messages-and-message-queues

    0 讨论(0)
提交回复
热议问题