Je me demande comment accepter l'entrée du clavier et de la souris en C ++, à l'aide de Visual Studio 2010, pour Windows 7 32 bits. p>
- Edit: J'ai oublié de mentionner que j'ai besoin d'une entrée de clavier / souris sans interrompre le flux du programme. Quelque chose comme un auditeur. Je ne veux pas avoir à mettre en pause le programme et à demander une entrée, puis à saisir l'utilisateur et appuyez sur Entrée. Ce que je cherche, c'est plus comme: p>
Si l'utilisateur appuie sur W, S, A, D -> Quelque chose arrive. p>
ou: si l'utilisateur appuie sur la gaucheMouseButton dans -> Quelque chose arrive. strong> p>
Je dois mentionner que je suis toujours très nouveau à la programmation dans son ensemble. Je connais la programmation de base de l'OOP mais c'est à ce sujet. Je suis certainement sûr que cela impliquera des choses que je ne connais pas encore, et cela ne me dérange pas, je me demande simplement que vous l'expliquant soigneusement, et éventuellement donner un exemple, donc je sais comment l'utiliser. P >
Merci. P>
4 Réponses :
Windows ou console?
Si la console, utilisez: p>
Je suis désolé, j'ai oublié de mentionner que j'essaie d'accepter les commentaires sans interrompre le programme. J'ai édité ma question initiale pour refléter cela maintenant. Merci d'avoir pris le temps de répondre.
Si vous écrivez une application de console, vous pouvez utiliser SCANF ou CL pour obtenir une entrée du clavier. Les applications de la console n'ont aucun support pour la souris. P>
Si vous écrivez une application d'interface graphique, vous construirez l'application à partir de commandes Windows standard contenant des comportements intégrés pour la souris et le clavier. Vous pouvez utiliser ces commandes de ré-utilisables, comme cela est ou vous pouvez les augmenter pour les faire se comporter exactement comment vous voulez pour votre application. P>
Par exemple, dans une application d'interface graphique, une commande d'édition standard vous permet d'utiliser que l'utilisateur peut saisir. Votre programme reçoit des messages lorsque l'utilisateur entre en texte de la textuelle et basé sur ces messages, ou sur d'autres événements, vous pouvez récupérer le texte et faire les choses avec elle, si nécessaire par votre programme. P>
Je suis désolé, j'ai oublié de mentionner que j'essaie d'accepter les commentaires sans interrompre le programme. J'ai édité ma question initiale pour refléter cela maintenant. Merci d'avoir pris le temps de répondre
Il y a un certain nombre de concepts connexes derrière cela. P>
Au niveau très bas, le clavier et la souris sont des périphériques matériels qui génèrent des " interruptions em>" (sous la forme de signaux électriques) à la CPU.
Le système d'exploitation fournit des em> les conducteurs em> qui gèrent de telles interruptions en décodant le protocole spécifique de la communication du périphérique et "normalisation" (au niveau du système d'exploitation) de ces signaux sous forme d'événements em>. < / p>
avec "Applications de console", le système d'exploitation gère ces événements (le clavier en particulier) en remplissant un tampon d'entrée (essentiellement un char []) qui est accessible sous la forme d'une "séquence pratiquement infinie de caractères" (nom complexe Pour "Fichier") nommé "CON", imitant ainsi le "modèle infini télétype" des ordinateurs débuts.
Dans un programme C ++, la bibliothèque standard-Start-ups de la bibliothèque standard - associe à ce "fichier" le avec des "applications graphiques", malheureusement, il n'y a pas de "modèle en début de journée" à MIMIQUE et "événements" est laissé disponible en tant que structure natif du système d'exploitation.
Différent système d'exploitation diffère dans la manière dont ces événements sont représentés et manipulés, mais certaines similitude peuvent être observées.
Pour Windows (puisque votre question est à propos de), un programme typique récupère ces événements de séquence avec une "boucle de message" dans laquelle appeler certaines API OS.
Dans cette boucle, le programme typique donnera également appel à une autre API OS pour envoyer ces événements à une procédure «rappel» appropriée, associée à une "fenêtre" précédemment créée.
Cette procédure de rappel doit détecter le code d'événement, jeter le paramètre le cas échéant et les gérer en fonction de l'action requise. P>
Un détail plus précis peut être vu avec un didacticiel de programmation Win32 comme http://www.winprog.org/ Tutoriel / .
La plus grande partie du code est essentiellement C, car c est la langue que l'API est formalisée.
Pour C ++, un certain nombre de bibliothèques ont ensuite été écrits pour représenter les objets du système d'exploitation constituent la forme de classes C ++ et de mapper les API du système d'exploitation aux membres de ces classes.
Ces bibliothèques peuvent être spécifiques à OS (comme MFC, WTL WTL ...) ou "multi-plate-forme" (elles existent dans une version différente, cartographier l'API de diverses interfaces C ++) telles que WXWidget, QT, GTK, FLTK. .. p>
J'espère que cela peut vous donner plus de conseils à penser. P> std :: Cin code> et
std :: COUT CODE> Stream em > Objets, vous pouvez donc lire la séquence de caractères d'entrée à l'aide du
std :: istream code> fonctions et opérateurs. p>
Merci beaucoup ^^. Cela aide vraiment quand il s'agit de la théorie derrière cela.
Utile, et je pense, nécessaire pour op. ++
Entrée de clavier / souris sans interrompre le flux
#include <windows.h> #include <iostream> using namespace std; int main() { HANDLE hIn; HANDLE hOut; COORD KeyWhere; COORD MouseWhere; COORD EndWhere; bool Continue = TRUE; int KeyEvents = 0; int MouseEvents = 0; INPUT_RECORD InRec; DWORD NumRead; hIn = GetStdHandle(STD_INPUT_HANDLE); hOut = GetStdHandle(STD_OUTPUT_HANDLE); cout << "Key Events : " << endl; cout << "Mouse Events : " << flush; KeyWhere.X = 15; KeyWhere.Y = 0; MouseWhere.X = 15; MouseWhere.Y = 1; EndWhere.X = 0; EndWhere.Y = 3; while (Continue) { ReadConsoleInput(hIn, &InRec, 1, &NumRead); switch (InRec.EventType) { case KEY_EVENT: ++KeyEvents; SetConsoleCursorPosition(hOut, KeyWhere); cout << KeyEvents << flush; if (InRec.Event.KeyEvent.uChar.AsciiChar == 'x') { SetConsoleCursorPosition(hOut, EndWhere); cout << "Exiting..." << endl; Continue = FALSE; } break; case MOUSE_EVENT: ++MouseEvents; SetConsoleCursorPosition(hOut, MouseWhere); cout << MouseEvents << flush; break; } } return 0; }
Merci beaucoup pour votre temps. J'ai trouvé cela vraiment utile.
Je me demandais si vous pouviez me montrer comment je pourrais vérifier quand une touche est enfoncée / libérée individuellement, au lieu d'événements clés dans son ensemble?
Si vous écrivez une application de console C ++, c'est un peu plus difficile que vous ne le pensez. Vous devrez écouter la pompe de message Windows pour différents messages et les interpréter. Qui ouvre une boîte totale de vers.