2009-04-02 5 views

Répondre

13

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.

1

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.

14

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; 
    } 
} 
+0

Avec l'approche @JamesBarrass vous pouvez avoir Ctrl + Lettre X + Lettre Y: http://stackoverflow.com/questions/11157868/capturing-ctrl-multiple-key-downs –

0

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.

4

Avec

Keyboard.IsKeyDown(Key.YourKey) 

vous pouvez gérer plusieurs keydowns.

+1

Salut, pourriez-vous préciser sur quelle bibliothèque vient le clavier? – randfur

+2

System.Windows.Input.KeyBoard – Andreas

+0

Bon ajustement pour WPF. (En parlant d'assemblage, cela vient de PresentationCore.dll) –

0

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

Questions connexes