11
votes

Comment obtenir une combinaison de clés en C #

Comment capturer Ctrl + alt + k + p clés sur un formulaire C #? merci


1 commentaires

Globalement ou juste lorsque le formulaire a la concentration?


5 Réponses :


1
votes

Voir ce grand blog post sur la mise en place de raccourcis de raccourci en C #


0 commentaires

2
votes

MessageFilters peut vous aider dans ce cas. XXX

Dans votre C # Windowsform, enregistrez le messageFilter pour capturer des coups de clé et des combinaisons. xxx

En quelque sorte, il ne détecte que Ctrl + alt + k . Veuillez lire le commentaire dans le code de MessageFilter.


0 commentaires

8
votes

Je ne suis pas sûr si vous le pouvez. Ce que vous pouvez faire cependant, est la façon dont Visual Studio le fait. Il a des raccourcis comme Ctrl + k , c . Vous appuyez d'abord sur CTRL + k , puis maintenez enfoncé ctrl et appuyez sur C . Dans votre cas, vous pouvez vérifier ctrl + alt + k , p .

Vous pouvez d'abord Vérifiez uniquement Ctrl + alt + k comme fait dans les autres réponses, puis définissez une variable / drapeau de membre pour indiquer Ctrl < / kbd> + alt + k a été enfoncé. Dans la même méthode où vous recherchez k Vous pouvez vérifier p , et si le drapeau que vous venez de définir a été défini sur true, faites tout ce que vous devez faire. Sinon, réglez le drapeau sur FALSE.

pseudo-code rugueux: xxx

espère que c'est assez clair.


0 commentaires

14
votes

C'est un accord, vous ne pouvez pas la détecter sans mémoriser avoir vu la première frappe de l'accord. Cela fonctionne:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    private bool prefixSeen;

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (prefixSeen) {
            if (keyData == (Keys.Alt | Keys.Control | Keys.P)) {
                MessageBox.Show("Got it!");
            }
            prefixSeen = false;
            return true;
        }
        if (keyData == (Keys.Alt | Keys.Control | Keys.K)) {
            prefixSeen = true;
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}


7 commentaires

Cela ne capturera-t-il pas de répéter les touches? Si un accord comme CTRL + P + P est utilisé par exemple?


Les touches répétitives produiraient CTRL + P CTRL + p. Donc non.


Je viens de compiler et de tester le code, et il fait (incorrectement) capture les touches de répétition si l'accord utilise la même clé deux fois. Par exemple, Holding Ctrl + ALT + P déclenchera le CTRL + ALT + P + P CORD.


Ensuite, vous avez fait mal, supprimez les clés.alt et les touches.control de la deuxième déclaration IF ().


Que voulez-vous dire, je "ai mal fait"? C'est votre code ... :-) Je viens de remplacer "Keys.k" avec "Keys.P". Et supprime ALT et Control, comme vous l'avez suggéré, bloquerait la clé «P» d'être utilisée du tout sous la forme.


Oups, première déclaration si (). Cliquez sur le bouton Posez une question si vous avez toujours des problèmes.


Non, ça ne fonctionnera pas non plus. Mais ce n'est pas le point. Ce code ne fonctionnera pas pour certains accords et je voulais signaler cela à d'autres utilisateurs.



2
votes

Vous pouvez utiliser getkeystate Pour obtenir le statut des autres touches lorsque l'une des touches de la combinaison a été enfoncée. Voici un exemple sur une forme.

using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace DetectKeyChord
{
    public partial class Form1 : Form
    {
        private const int WM_KEYDOWN = 0x100;
        private const int KEY_PRESSED = 0x80;

        public Form1()
        {
            InitializeComponent();
        }

        public void ShortcutAction()
        {
            MessageBox.Show("Ctrl+Alt+K+P has been pressed.");
        }

        private bool IsKeyDown(Keys key)
        {
            return (NativeMethods.GetKeyState(key) & KEY_PRESSED) == KEY_PRESSED;
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_KEYDOWN)
            {
                //If any of the keys in the chord have been pressed, check to see if
                //the entire chord is down.
                if (new[] { Keys.P, Keys.K, Keys.ControlKey, Keys.Menu }.Contains((Keys)m.WParam))
                {
                    if (IsKeyDown(Keys.ControlKey) && IsKeyDown(Keys.Menu) && IsKeyDown(Keys.K) && IsKeyDown(Keys.P))
                    {
                        this.ShortcutAction();
                    }
                }
            }
            base.WndProc(ref m);
        }
    }

    public static class NativeMethods
    {
        [DllImport("USER32.dll")]
        public static extern short GetKeyState(Keys nVirtKey);
    }
}


0 commentaires