Ingresso tastiera e loop di messaggi Win32

Come gestisco le pressioni dei tasti e gli eventi di key up nel ciclo dei messaggi di Windows? Devo essere in grado di chiamare due funzioni OnKeyUp(char c); e OnKeyDown(char c); .

La letteratura attuale che ho trovato su Google mi ha portato a confondere su WM_CHAR o WM_KEYUP e WM_KEYDOWN, e di solito è mirato al PDA o al codice gestito, mentre sto usando C ++.

Un tipico ciclo di messaggi C ++ si presenta così

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

La funzione di TranslateMessage è di generare messaggi WM_CHAR dai messaggi WM_KEYDOWN, quindi se vuoi vedere i messaggi WM_CHAR devi assicurarti di passare i messaggi WM_KEYDOWN. Se non ti interessa dei messaggi WM_CHAR, puoi saltarlo e fare qualcosa di simile.

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

Si noti che i messaggi OnKeyDown e OnKeyUp sono definiti come prendendo una WPARAM piuttosto che un carattere. Questo perché i valori per WM_KEYDOWN e WM_KEYUP non sono limitati ai valori che si adattano a un char. Vedi WM_KEYDOWN

Usa char c = MapVirtualKey(param,MAPVK_VK_TO_CHAR); per convertire i codici di chiave virtuale in char e elaborare WM_KEYUP e WM_KEYDOWN e le loro 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); }