Obtenir une touche dans la console Windows

J’ai trouvé ce morceau de code en ligne:

CHAR getch() { DWORD mode, cc; HANDLE h = GetStdHandle( STD_INPUT_HANDLE ); if (h == NULL) { return 0; // console not found } GetConsoleMode( h, &mode ); SetConsoleMode( h, mode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT) ); TCHAR c = 0; ReadConsole( h, &c, 1, &cc, NULL ); SetConsoleMode( h, mode ); return c; } 

En l’utilisant comme:

 while(1) { TCHAR key = getch(); } 

Je suis capable d’obtenir des touches numériques, alphabétiques, et même de revenir. Mais je ne peux pas obtenir d’évasion ni d’autres touches fonctionnelles comme le contrôle, alt. Est-il possible de le modifier pour détecter également ces clés?

Si des éléments tels que les touches de contrôle et les touches Alt sont des touches virtuelles, ils complètent les caractères. Vous devrez utiliser ReadConsoleInput . Mais vous aurez tout, la souris aussi. Vous devez donc vraiment filtrer et renvoyer une structure à partir de l’appel afin de savoir si elle ressemble à ctrl-A Alt-A. Le filtre répète si vous ne les voulez pas.

Cela peut nécessiter du travail, je ne sais pas ce que vous cherchez …

 bool getconchar( KEY_EVENT_RECORD& krec ) { DWORD cc; INPUT_RECORD irec; HANDLE h = GetStdHandle( STD_INPUT_HANDLE ); if (h == NULL) { return false; // console not found } for( ; ; ) { ReadConsoleInput( h, &irec, 1, &cc ); if( irec.EventType == KEY_EVENT && ((KEY_EVENT_RECORD&)irec.Event).bKeyDown )//&& ! ((KEY_EVENT_RECORD&)irec.Event).wRepeatCount ) { krec= (KEY_EVENT_RECORD&)irec.Event; return true; } } return false; //future ???? } int main( ) { KEY_EVENT_RECORD key; for( ; ; ) { getconchar( key ); std::cout << "key: " << key.uChar.AsciiChar << " code: " << key.wVirtualKeyCode << std::endl; } } 

Fonction ReadConsoleInput

Structure INPUT_RECORD

Structure KEY_EVENT_RECORD

Codes de clés virtuelles

vous avez beaucoup de façons d’obtenir les entrées au clavier

vous pouvez utiliser GetAsyncKeyState https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646293(v=vs.85).aspx ou GetKeyState https://msdn.microsoft.com/fr-fr/ bibliothèque / windows / desktop / ms646301.aspx

qui sont bien meilleurs que getch