web-dev-qa-db-fra.com

Capturer une touche du clavier en arrière-plan

J'ai une application qui s'exécute en arrière-plan. Je dois générer un événement chaque fois qu'un utilisateur appuie sur F12 à tout moment. Donc, ce dont j'ai besoin pour capturer une pression sur une touche. Dans mon application, si un utilisateur appuie sur F10 un événement sera exécuté. Je ne comprends pas comment faire ça?

Avez-vous une idée de comment faire cela?

N: B: C'est une application winforms. Il n'a pas besoin d'avoir le focus sur ma forme. Ma fenêtre principale peut rester dans la barre d'état système, mais elle doit toujours capturer la touche.

19
ImonBayazid

Ce que vous voulez, c'est un raccourci clavier global.

  1. Importez les bibliothèques nécessaires en haut de votre classe:

    // DLL libraries used to manage hotkeys
    [DllImport("user32.dll")] 
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
    [DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
  2. Ajoutez un champ dans votre classe qui sera une référence pour le raccourci clavier dans votre code:

    const int MYACTION_HOTKEY_ID = 1;
    
  3. Enregistrez le raccourci clavier (dans le constructeur de votre formulaire Windows par exemple):

    // Modifier keys codes: Alt = 1, Ctrl = 2, Shift = 4, Win = 8
    // Compute the addition of each combination of the keys you want to be pressed
    // ALT+CTRL = 1 + 2 = 3 , CTRL+SHIFT = 2 + 4 = 6...
    RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 6, (int) Keys.F12);
    
  4. Manipulez les clés tapées en ajoutant la méthode suivante dans votre classe:

    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID) {
            // My hotkey has been typed
    
            // Do what you want here
            // ...
        }
        base.WndProc(ref m);
    }
    
35
Otiel

En cas de problème lors de l'exécution de la solution d'Otiel:

  1. Vous devez inclure:

    using System.Runtime.InteropServices; //required for dll import
    
  2. Un autre doute pour les débutants comme moi: "haut de la classe" signifie vraiment haut de votre classe comme ça (pas d'espace de nom ni de constructeur):

    public partial class Form1 : Form
    {
    
        [DllImport("user32.dll")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
        [DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
  3. Vous n'avez pas besoin d'ajouter user32.dll comme référence au projet. WinForms charge toujours cette DLL automatiquement.

9
baron_bartek