2017-03-17 3 views
2

Deutsche Tastaturen haben einen Key namens "Alt Gr". Es sieht so aus, als ob Windows es so behandelt, als würde man alt + ctrl drücken.AltGr vs LeftCtrl

Aber ich muss herausfinden (in C#), wenn der Benutzer die Taste zusammen mit der linken Strg gedrückt hat.

Gibt es eine Möglichkeit zwischen

  • Benutzer drückt zu unterscheiden: "Alt Gr"
  • Benutzer drückt: "Alt Gr" und "links ctrl" zur gleichen Zeit

System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.Key.LeftCtrl) ist in beiden Fällen wahr.

System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.Key.RightAlt) gilt auch in beiden Fällen.

System.Windows.Input.Keyboard.Modifiers gibt in beiden Fällen auch "Alt | Control" zurück.

+0

Alt Gr ist ein sehr oft verwendeter Key auf deutschen Keyboards. Es wird verwendet, um "@", "€", "\", "~" und mehrere andere Zeichen – Generator

+0

@NickA aus Interesse zu schreiben, ist das erweiterte Bit auf dem Scancode das gleiche für beide? – stuartd

+0

@NickA gibt es ein erweitertes Bit auf Scancodes, sowohl rechts als auch links alt sind '0x38' aber links hat' 0' als das erweiterte Bit, und rechts hat '0xE0', so können Sie sie unterscheiden. Es gibt eine Menge [Altcode in Scancodes] (https://blogs.msdn.microsoft.com/oldnewthing/20080211-00/?p=23503/)! – stuartd

Antwort

1

Durch mein Interesse an dieser Frage habe ich ein wenig Forschung mit GLFW und C++:

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) 
{ 
    if (action == GLFW_PRESS) { 
     std::cout << std::hex << scancode << std::endl; 
    } 
} 

diesen Code verwenden wir die folgenden Scancodes sehen:

Left Alt: 0x0038 
Right Alt: 0x0138 
Left Ctrl: 0x001d 
Right Ctrl: 0x011d 

Wie Sie können siehe die Modifier-Tasten auf der rechten Seite der Tastatur haben ein erweitertes Bit (Danke Stuartd) und so mit GLFW ist es möglich, zwischen beiden Alts und beide Kontrollen zu unterscheiden.

jedoch das .NET Framework in C#, wie Sie sind ich folgenden Callback:

private void func(object sender, KeyEventArgs e) { 
    MessageBox.Show(e.KeyValue.ToString()); 
    MessageBox.Show(e.Alt.ToString()); 
    MessageBox.Show(e.Control.ToString()); 
    MessageBox.Show(e.Modifiers.ToString()); 
} 

Ich habe auch die Ergebnisse:

Left Alt: 18 True False Alt 
Right Alt: 17 False True Control 
Left Ctrl: 17 False True Control 
Right Ctrl: 17 False True Control 

dies, weil ich geneigt wären zu sagen, dass dies eine Einschränkung des .NET Framework ist, zumindest in der Version, die ich verwende (4.5.2) und dass die Antwort auf Ihre Frage in diesem Fall ist, können Sie nicht zwischen Left Ctrl + Right Alt und Right Alt unterscheiden. Ich schlage vor, Sie betrachten this answer und verwenden stattdessen die Win32-API.

Beachten Sie auch, dass Right AltAlt Gr ist.

+0

Vielen Dank für Ihre Antwort. Soweit ich es versuchte, hat Win32 API das gleiche Problem als .NET. – Generator

Verwandte Themen