C# flèche clé d'entrée pour une application console
J'ai une simple application console en C#. Je veux être en mesure de détecter la touche flèche presses, donc je ne peux permettre à l'utilisateur de diriger. Comment puis-je détecter keydown/keyup événements avec une application console?
Tous mes googler a conduit à des infos sur windows Forms. Je n'ai pas d'interface graphique. C'est une application console (pour le contrôle d'un robot sur un port série).
J'ai de fonctions écrites pour gérer ces événements, mais je n'ai aucune idée de comment s'inscrire pour recevoir les événements:
private void myKeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Left:
...
case Keys.Right:
...
case Keys.Up:
...
}
}
private void myKeyUp(object sender, KeyEventArgs e)
{
... pretty much the same as myKeyDown
}
C'est probablement vraiment une question de base, mais je suis assez novice en C#, et je n'ai jamais eu besoin d'obtenir ce genre d'entrée avant.
Mise à jour: Nombreux sont ce qui suggère-je utiliser System.Console.ReadKey(true).Key
. Cela n'aidera pas. J'ai besoin de savoir le moment où une touche est maintenue enfoncée, quand il est libéré, avec le soutien de plusieurs touches d'être enfoncée simultanément. Aussi, ReadKey est un appel bloquant, ce qui veut dire que le programme va s'arrêter et d'attendre pour une touche à presser.
Mise à jour: Il semble que le seul moyen efficace de le faire est d'utiliser Windows Forms. C'est ennuyeux, que je ne peux pas l'utiliser sur un système bancal. Ils requièrent une interface graphique pour recevoir l'entrée de clavier est ... stupide.
Mais de toute façon, pour la postérité, voici ma solution. J'ai créé un nouveau projet de Formulaire dans mon .sln:
private void Form1_Load(object sender, EventArgs e)
{
try
{
this.KeyDown += new KeyEventHandler(Form1_KeyDown);
this.KeyUp += new KeyEventHandler(Form1_KeyUp);
}
catch (Exception exc)
{
...
}
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
//handle up/down/left/right
case Keys.Up:
case Keys.Left:
case Keys.Right:
case Keys.Down:
default: return; //ignore other keys
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
//undo what was done by KeyDown
}
Notez que si vous maintenez une touche enfoncée, KeyDown sera appelé à de nombreuses reprises, et KeyUp ne sera appelée qu'une seule fois (lors de la libération). Donc, vous avez besoin pour gérer répété KeyDown appels normalement.
OriginalL'auteur Tim | 2010-12-04
Vous devez vous connecter pour publier un commentaire.
Un peu tard maintenant, mais voici comment accéder à l'état du clavier dans une application console.
Noter que ce n'est pas tout le code managé car elle nécessite GetKeyState à être importées à partir de User32.dll.
Oui, les applications de console n'avez généralement pas une boucle de message, mais il n'y a rien pour vous empêcher de vous rouler votre propre, et puis d'avoir le reste de votre application seront déterminées par les événements.
Très utile, +1 pour cet!
OriginalL'auteur Ergwun
ou un autre exemple, juste pour votre cas:
OriginalL'auteur The Smallest
Vous pourriez mettre dans un spin, quelque chose comme:
Alors vous avez besoin pour gérer les messages de clavier directement. Façon la plus simple pour cela est d'utiliser DirectInput sur Windows.
Si vous devez le faire manuellement, les fonctions Win32 sont GetConsoleWindow et SetWindowsHookEx. Crochet de la Console " WH_CALLWNDPROC de l'événement afin de piéger les premières messages de Windows. Une console n'est pas beaucoup de l'abstraction qu'un Formulaire Windows n', bien qu'il puisse avoir les fonctionnalités que vous êtes à la recherche pour le fait que personne n'a suggéré qu'il implique pour moi c'est votre prochaine étape logique.
Si vous avez l'intention de créer une très interactive, l'application vous pourriez être mieux de créer un faux-console dans un Formulaire Windows. C'est une technique populaire pour la création d'rudimentaire des jeux vidéo de l'Isu.
Gardez à l'esprit qu'entre chaque touche d'un clavier et les touches shift, ctrl, alt, etc modificateurs vous avez des centaines de combinaisons de touches à votre disposition. Donc pourquoi il n'est pas exactement la fonctionnalité standard de vouloir plus que cela.
OriginalL'auteur Rushyo
exemple de code:
OriginalL'auteur BrokenGlass
vous pouvez le faire
OriginalL'auteur Sagiv Oulu
J'ai le même problème que vous et j'ai trouvé, ici, un post intéressant à l'aide de tâches.
Le post original peut être trouvé ici:
Application Console C# - Comment puis-je toujours lire l'entrée à partir de la console?
J'ai pour émuler une sortie PWM à travers une Framboise GPIO (à l'aide de mono C#) pour tester un écran LCD rétro-éclairé. Avec deux simples touches je voulais changer le cycle de service (haut/bas) et une clé supplémentaire pour arrêter le programme.
J'ai essayé ce (variables):
Programme principal:
Lorsqu'il est nécessaire d'incrémenter le cycle, appuyer sur 'W' clé fait que la tâche principale des changements du cycle variable (devoir); la même chose avec la touche 'S' pour décrémenter. Le programme se termine lorsque la touche " X " est pressé.
OriginalL'auteur Hagen