簡體   English   中英

鍵盤輸入和Win32消息循環

[英]Keyboard Input & the Win32 message loop

如何在Windows消息循環中處理按鍵和鍵入事件? 我需要能夠調用兩個函數OnKeyUp(char c); OnKeyDown(char c);

我從google搜索中找到的當前文獻讓我對WM_CHAR或WM_KEYUP和WM_KEYDOWN感到困惑,並且通常針對PDA或托管代碼,而我使用的是C ++。

典型的C ++消息循環如下所示

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

TranslateMessage的功能是從WM_KEYDOWN消息生成WM_CHAR消息,因此如果要查看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 if (msg.message == WM_KEYUP)
       OnKeyUp(msg.wParam);
    else
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }
}

請注意,OnKeyDown和OnKeyUp消息被定義為采用WPARAM而不是char。 這是因為WM_KEYDOWN和WM_KEYUP的值不限於適合char的值。 WM_KEYDOWN

更多:
使用消息和消息隊列
https://docs.microsoft.com/en-us/windows/win32/winmsg/using-messages-and-message-queues

使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM