2017-03-17 5 views
2

Les claviers allemands ont une clé appelée "Alt Gr". Il semble que les fenêtres le traitent comme si on appuyait sur alt + ctrl.AltGr vs LeftCtrl

Mais je dois savoir (en C#) si l'utilisateur a appuyé sur la touche avec le ctrl gauche.

Est-il possible de faire la distinction entre

  • presses de l'utilisateur: "Alt Gr"
  • presses de l'utilisateur: "Alt Gr" et "gauche ctrl" en même temps

System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.Key.LeftCtrl) est vrai dans les deux cas.

System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.Key.RightAlt) est également vrai dans les deux cas.

System.Windows.Input.Keyboard.Modifiers renvoie également "Alt | Control" dans les deux cas.

+0

Alt Gr est une touche très souvent utilisée sur les claviers allemands. Son utilisé pour écrire "@", "€", "\", "~" et plusieurs autres caractères – Generator

+0

@NickA par intérêt, est le bit étendu sur le scancode la même chose pour les deux? – stuartd

+0

@NickA il y a un bit étendu sur les scancodes, à droite et à gauche alt sont '0x38' mais à gauche a' 0' comme le bit étendu, et à droite a '0xE0', qui est comment vous pouvez les différencier. Il y a beaucoup de [code hérité dans Scancodes] (https://blogs.msdn.microsoft.com/oldnewthing/20080211-00/?p=23503/)! – stuartd

Répondre

1

En raison de mon intérêt pour cette question, je fait un peu de recherche en utilisant GLFW et 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; 
    } 
} 

En utilisant ce code je peux voir les scancodes suivants:

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

Comme vous pouvez le voir les touches de modification sur le côté droit du clavier ont un bit étendu (merci stuartd) et donc en utilisant GLFW, il est possible de faire la distinction entre les deux alts et les deux contrôles.

Cependant, en utilisant le .NET Framework en C# que vous êtes je le rappel suivant:

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

J'ai aussi obtenu les résultats de:

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

En raison de cela, je serais enclin pour dire que c'est une limitation du .NET Framework, au moins dans la version que j'utilise (4.5.2) et que la réponse à votre question dans ce cas est, non, vous ne pouvez pas distinguer entre Left Ctrl + Right Alt et Right Alt. Je vous suggère de regarder this answer et d'utiliser l'API Win32 à la place. Notez également que Right Alt est Alt Gr.

+0

Merci pour votre réponse. Pour autant que j'ai essayé, Win32 API a le même problème que .NET. – Generator