7 votes

Capturer la frappe sans focus dans la console

Je sais qu'il existe une question pour Windows Forms mais cela ne fonctionne pas dans la console, ou du moins je n'ai pas réussi à le faire fonctionner. J'ai besoin de capturer les pressions de touche même si la console n'a pas le focus.

15voto

Eric J. Points 73338

Vous pouvez créer un crochet de clavier global dans une application console aussi.

Voici le code complet et fonctionnel:
https://learn.microsoft.com/en-us/archive/blogs/toub/low-level-keyboard-hook-in-c

Vous créez une application console, mais vous devez ajouter une référence à System.Windows.Forms pour que cela fonctionne. Il n'y a aucune raison pour qu'une application console ne puisse pas référencer ce fichier dll.

J'ai simplement créé une application console en utilisant ce code et vérifié qu'il reçoit chaque touche enfoncée, que l'application console ait le focus ou non.

ÉDITER

Le thread principal exécutera Application.Run() jusqu'à ce que l'application se termine, par exemple via un appel à Application.Exit(). Le moyen le plus simple de réaliser d'autres tâches est de démarrer une nouvelle tâche pour effectuer ce travail. Voici une version modifiée de Main() du code lié qui le fait

public static void Main()
{
    var doWork = Task.Run(() =>
        {
            for (int i = 0; i < 20; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }
            Application.Exit(); // Sortie rapide pour la démonstration seulement.  
        });

    _hookID = SetHook(_proc);

    Application.Run();

    UnhookWindowsHookEx(_hookID);
}

REMARQUE

Fournir éventuellement un moyen de quitter l'application Console, par exemple lorsqu'une combinaison de touches spéciale est enfoncée en fonction de vos besoins spécifiques. Dans la

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X