Comment puis-je capturer plusieurs claviers en C# lorsque je travaille sous un formulaire Windows Forms?Capture de plusieurs claviers en C#
Je n'arrive pas à obtenir à la fois la flèche haut et la flèche droite en même temps.
Comment puis-je capturer plusieurs claviers en C# lorsque je travaille sous un formulaire Windows Forms?Capture de plusieurs claviers en C#
Je n'arrive pas à obtenir à la fois la flèche haut et la flèche droite en même temps.
Je pense que vous serez mieux lorsque vous utilisez la fonction API GetKeyboardState.
[DllImport ("user32.dll")]
public static extern int GetKeyboardState(byte[] keystate);
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
byte[] keys = new byte[256];
GetKeyboardState (keys);
if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128) == 128)
{
Console.WriteLine ("Up Arrow key and Right Arrow key down.");
}
}
Dans l'événement KeyDown, vous demandez simplement l'état du clavier. Le GetKeyboardState va remplir le tableau d'octets que vous donnez, et chaque élément de ce tableau représente l'état d'une clé.
Vous pouvez accéder à chaque keystate en utilisant la valeur numérique de chaque code de touche virtuelle. Lorsque l'octet de cette touche est réglé sur 129 ou 128, cela signifie que la touche est enfoncée (enfoncée). Si la valeur de cette touche est 1 ou 0, la touche est en haut (non enfoncée). La valeur 1 est destinée à un état de clé basculé (par exemple, état de verrouillage des majuscules).
Pour plus de détails, voir le Microsoft documentation for GetKeyboardState.
Hmm, y a-t-il des événements distincts pour chaque touche?
Vous pouvez créer quatre booléens pour chaque flèche. Lorsque vous appuyez dessus, définissez le booléen de cette flèche sur true. Si la libération est déclenchée, définissez le booléen de cette flèche sur false.
Ensuite, vous pouvez vérifier si les booléens up et right sont vrais et ensuite faire votre action.
Un peu de preuve de concept de code pour vous, en supposant Form1
contient label1
:
private List<Keys> pressedKeys = new List<Keys>();
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
pressedKeys.Add(e.KeyCode);
printPressedKeys();
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
pressedKeys.Remove(e.KeyCode);
printPressedKeys();
}
private void printPressedKeys()
{
label1.Text = string.Empty;
foreach (var key in pressedKeys)
{
label1.Text += key.ToString() + Environment.NewLine;
}
}
Utilisez SPY ++ pour voir comment les touches sont déclenchées. Fondamentalement, si plusieurs touches fléchées sont enfoncées en même temps, la première touche qui a été touchée déclenchera des événements, et lorsque la deuxième touche sera touchée, elle commencera à tirer et vous ne verrez plus d'événements pour la première. Quand ils sont libérés, vous verrez leurs événements clés. Je vous suggère de mettre en œuvre les drapeaux suggérés plus tôt, c'est simple et rapide.
Il existe une bibliothèque gérée MouseKeyHook as nuget qui vous offre un wrapper managé. Source code on github.
Récemment, la prise en charge de la détection de raccourcis, de combinaisons de touches et de séquences a été ajoutée. Voici un exemple d'utilisation pour traiter avec des flèches:
Hook.AppEvents().OnCombination(new Dictionary<Combination, Action>
{
{Combination.FromString("Left"), GoWest},
{Combination.FromString("Left+Up"), GoNorthWest},
{Combination.FromString("Up+Left"), GoNorthWest},
{Combination.FromString("Up"), GoNorth},
{Combination.FromString("Up+Right"), GoNorthEast},
{Combination.FromString("Right+Up"), GoNorthEast},
});
Pour plus d'informations, voir: Detecting Key Combinations and Seuqnces
Avec l'approche @JamesBarrass vous pouvez avoir Ctrl + Lettre X + Lettre Y: http://stackoverflow.com/questions/11157868/capturing-ctrl-multiple-key-downs –