2009-04-02 17 views

Antwort

13

Ich glaube, Sie am besten dran sein werden, wenn Sie die GetKeyboardState API-Funktion verwenden.

[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."); 
    } 
} 

Im KeyDown-Ereignis fragen Sie einfach nach dem "Status" der Tastatur. GetKeyboardState füllt das von Ihnen angegebene Byte-Array und jedes Element in diesem Array stellt den Status eines Schlüssels dar.

Sie können auf jeden Keystate zugreifen, indem Sie den numerischen Wert jedes virtuellen Tastencodes verwenden. Wenn das Byte für diese Taste auf 129 oder 128 gesetzt ist, bedeutet dies, dass die Taste gedrückt ist. Wenn der Wert für diese Taste 1 oder 0 ist, ist die Taste gedrückt (nicht gedrückt). Der Wert 1 ist für den umgestellten Zustand des Schlüssels gedacht (z. B. Feststelltaste).

Für Details siehe Microsoft documentation for GetKeyboardState.

1

Hmm, gibt es separate Ereignisse für jede Taste gedrückt?

Sie können für jeden Pfeil vier boolesche Werte erstellen. Wenn es gedrückt wird, setze den Booleschen Wert dieses Pfeils auf wahr. Wenn die Freigabe ausgelöst wird, setzen Sie den booleschen Wert dieses Pfeils auf false.

Dann können Sie überprüfen, ob die oben und rechts boolean true sind und dann Ihre Maßnahmen ergreifen.

14

Ein wenig Proof-of-Concept-Code für Sie, Form1 unter der Annahme, enthält 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

Mit @JamesBarrass nähern können Sie Strg + Letter X + Letter Y haben: http://stackoverflow.com/questions/11157868/capturing-ctrl-multiple-key-downs –

0

Verwenden Sie SPY ++, um zu sehen, wie Key Downs ausgelöst werden. Grundsätzlich, wenn mehrere Pfeiltasten gleichzeitig gedrückt werden, löst der erste getroffene Schlüssel Ereignisse aus. Wenn der zweite Schlüssel getroffen wird, beginnt er zu feuern und Sie werden keine Ereignisse mehr für das erste sehen. Wenn sie veröffentlicht werden, sehen Sie ihre Schlüsselereignisse. Ich würde vorschlagen, dass Sie die früher vorgeschlagenen Bool Flags schnell und einfach implementieren.

4

Mit

Keyboard.IsKeyDown(Key.YourKey) 

können Sie mehrere keydowns behandeln.

+1

Hallo, könnten Sie näher erläutern, aus welcher Bibliothek Keyboard stammt? – randfur

+2

System.Windows.Input.KeyBoard – Andreas

+0

Gut geeignet für WPF. (Assembly sprechend, kommt es von PresentationCore.dll) –

0

Es gibt eine verwaltete Bibliothek MouseKeyHook as nuget, die Ihnen einen Convenience Managed Wrapper bietet. Source code on github.

Kürzlich wurde die Unterstützung für das Erkennen von Shortcuts, Tastenkombinationen und Sequenzen hinzugefügt. Hier ist ein Anwendungsbeispiel mit Pfeilen umgehen:

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}, 
}); 

Weitere Informationen finden Sie unter: Detecting Key Combinations and Seuqnces