AltGr vs LeftCtrl

时间:2017-03-17 17:32:36

标签: c# keyboard controls modifier

德国键盘有一个名为“Alt Gr”的键。看起来像windows一样对待它就像按下alt + ctrl。

但我必须找出(在c#中)用户是否按下了左键ctrl。

有没有办法区分

  • 用户按下:“Alt Gr”
  • 用户同时按下“Alt Gr”和“left ctrl”

System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.Key.LeftCtrl)在两种情况下都是正确的。

在这两种情况下,

System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.Key.RightAlt)也是如此。

在这两种情况下,

System.Windows.Input.Keyboard.Modifiers也会返回“Alt | Control”。

1 个答案:

答案 0 :(得分:1)

由于我对这个问题感兴趣,我使用GLFW和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;
    }
}

使用此代码,我可以看到以下扫描码:

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

正如您所看到的,键盘右侧的修改键有一个扩展位(感谢stuartd),因此使用GLFW可以区分alts和两个控件。

但是,在C#中使用.NET Framework时,我使用了以下回调:

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

我也得到了结果:

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

因此我倾向于说这是.NET Framework的限制,至少在我使用的版本(4.5.2)中,在这种情况下你的问题的答案是,不,你无法区分Left Ctrl + Right AltRight Alt。我建议您查看this answer并改用Win32 API。

另请注意,Right AltAlt Gr