Question

Je suis resté bloqué.

En ce moment, je suis en utilisant le code suivant pour écouter les raccourcis clavier:

    [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);


    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0312)
        {
            // whatever i need
        }
        base.WndProc(ref m);
    }

et cette fonction pour enregistrer hotkey:

Form1.RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 0, (int)chr);

il fonctionne parfaitement. ma question est de savoir comment puis-je enregistrer plusieurs raccourcis clavier que la même combinaison, par exemple:

  1. A + B + C + D
  2. ALT + SHIFT + B
  3. CTRL + ALT + SHIFT + X

edit: j'ai découvert (comme Zooba dit) comment « Déchiffrer » qui a été envoyé et hotkey voici la solution:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0312)
        {
            Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
            ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF);
            if ((modifier + "+" + key == "Alt+S"))
            {
                //do what ever I need.
            }
        }
        base.WndProc(ref m);
    }
Était-ce utile?

La solution 2

J'ai trouvé la réponse. Au lieu d'utiliser registerhotkey, je KeyState et résolu tous mes problèmes. Si quelqu'un est intéressé, vous pouvez allez ici ( sauvegarde sur archive.org )

Autres conseils

De la documentation WM_HOTKEY :

  

lParam Le mot d'ordre bas spécifie les clés qui devaient être est associée à la clé spécifiée par le mot d'ordre élevé pour générer le message WM_HOTKEY. Ce mot peut être un ou plusieurs des valeurs suivantes. Le mot d'ordre élevé spécifie le code clé virtuelle de la touche de raccourci.

Vous pouvez lire le membre de LParam de m pour déterminer les clés qui ont été pressées (alternativement, si vous attribuez des identifiants plus sensibles que GetHashCode vous pouvez vérifier WParam).

Le « mot d'ordre supérieur » et « mot de poids faible » se réfèrent à des parties de l'entier (en fait un IntPtr) contenu dans LParam, vous aurez donc besoin d'extraire ces derniers. Le mot d'ordre faible est i & 0xFFFF, alors que le mot d'ordre élevé est (i >> 16) & 0xFFFF.

Pour détecter quelle combinaison de touches a été enfoncée, vérifier les quatre bits les plus bas du mot de poids faible pour les modificateurs (décalage, alt, contrôle) et de comparer le mot d'ordre élevé par rapport au code de touche virtuelle - qui, pour lettres est égal à la valeur de caractère du capital (par exemple, le code de clé virtuelle a est (int) 'a', mais pas (int) 'a').

Votre combinaison 'A + B + C + D' est pas valable, puisque hotkeys WM_HOTKEY ne supportent qu'un seul caractère. Vous devrez joindre un crochet du clavier pour détecter cette combinaison de partout (ou messages poignée si vous voulez seulement le détecter alors que l'application est activée).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top