Keyboard Input and Win32 Message Connector

How to handle keystrokes and fire events in a Windows message loop? I need to be able to call two OnKeyUp(char c); functions OnKeyUp(char c); and OnKeyDown(char c); .

The current literature that I found from googling has led me to confusion regarding WM_CHAR or WM_KEYUP and WM_KEYDOWN, and it usually focuses on PDAs or managed code, whereas I use C ++.

+4
source share
2 answers

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); } 
+7
source

A typical C ++ message loop is as follows

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

The TranslateMessage function is to generate WM_CHAR messages from WM_KEYDOWN messages, so if you want to see WM_CHAR messages, you must send WM_KEYDOWN messages to it. If you are not interested in WM_CHAR messages, you can skip this and do something similar.

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

Note that OnKeyDown and OnKeyUp messages are defined as receiving WPARAM, not a character. This is because the values ​​for WM_KEYDOWN and WM_KEYUP are not limited to the values ​​that are placed in the character. See WM_KEYDOWN

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

+11
source

Source: https://habr.com/ru/post/1304051/


All Articles