WM_KEYDOWN: captura de pulsación de tecla que causa el evento

Estoy tratando de hacer una tarea muy simple: que ocurra un evento cuando se presiona una tecla, pero tengo muchas dificultades para implementarlo.

Estoy usando la API de Win32. Me han preguntado qué marco de trabajo estoy usando, pero no lo sé. Estoy usando Visual C ++ y el progtwig es un progtwig de Windows.

Todo lo que quiero hacer es que ocurra un evento si se presiona una tecla específica. Para este ejemplo, estoy usando la tecla ‘s’, y el evento es un entero que se establece en 1 o 0; lo que no estaba configurado en el momento de la pulsación de la tecla (utilizaría bool, pero no sé cómo funciona todavía).

Me han dicho que use GetKeyState (), y luego me han dicho que esto en realidad no es bueno. También me han dicho que use WM_KEYDOWN pero no puedo averiguar cómo funciona esto … Seguramente lo que estoy haciendo debe ser una progtwigción básica absoluta (entrada de teclado> salida) pero no puedo obtener una explicación clara de cómo funciona ?!

He intentado usar lo siguiente, sin suerte:

int Flag; if (GetKeyState(115) == 1 && Flag == 0) Flag = 1; if (GetKeyState(115) == 1 && Flag == 1) Flag = 0; 

También he intentado usar esto:

 if (GetKeyState(115) & 0x8000 && Flag == 0) Flag = 1; if (GetKeyState(115) & 0x8000 && Flag == 1) Flag = 0; 

Ninguno de los dos trabajar ¿Alguien sabe cómo podría implementar WM_KEYDOWN?

Estoy usando un bucle de mensajes de Windows

Hay varias formas de resolver este problema. Ninguno de los cuales le dará una precisión de “nano-segundo”, pero aquí están.

Si desea que la pulsación de la tecla sea recibida por una ventana o un diálogo activos, maneja un WM_KEYDOWN incluso en la WINPROC del diálogo / ventana, de este modo.

 void InSomePlace() { WNDCLASS wndClass ZeroMemory( &wndClass, sizeof(wndClass) ); // Initialize wndClass members here wndClass.lpszClassName = _T("MyWindow"); wndClass.lpfnWndProc = &MyWndProcHandler; // RegisterClass( &wndClass ); HWND hWnd = CreateWindow( _T("MyWindow", /* lots of other parameters */ ); MSG msg; BOOL bRet; while ( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0 ) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } } LRESULT CALLBACK MyWndProcHandler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch ( uMsg ) { // Lots of case statements, in particular you want a WM_KEYDOWN case case WM_KEYDOWN: if ( wParam == 'S' ) { // Do something here return 0L; } break; } return DefWindowProc( hwnd, uMsg, wParam, lParam ); } 

Para un DialogBox es muy similar, todavía tendría un DLGPROC que se pasa como el último parámetro a DialogBox / CreateDialog

 void InSomePlace( HINSTANCE hInstance, HWND hParentWindow ) { DialogBox( hInstance, _T("MyDialogTemplate"), hParentWindow, &MyDialogProc ); } INT_PTR CALLBACK MyDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { case ( uMsg ) { // Lots of case statements, in particular you want a WM_KEYDOWN case case WM_KEYDOWN: if ( wParam == 'S' ) { // Do something here SetWindowLong(hwndDlg, DWL_MSGRESULT, 0L); return TRUE; } break; } return FALSE; }