【问题标题】:AltGr vs LeftCtrlAltGr 与 LeftCtrl
【发布时间】:2017-03-17 17:32:35
【问题描述】:

德语键盘有一个名为“Alt Gr”的键。好像windows把它当作按alt+ctrl来对待。

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

有没有办法区分

  • 用户按下:“Alt Gr”
  • 用户同时按下“Alt Gr”和“左 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”。

【问题讨论】:

  • Alt Gr 是德语键盘上一个非常常用的键。用于书写“@”、“€”、“\”、“~”等几个字符
  • @NickA 不感兴趣,扫描码上的扩展位是否相同?
  • @NickA 扫描码上有一个扩展位,左右 alt 都是 0x38,但左边有 0 作为扩展位,右边有 0xE0,这就是你可以分辨的方式他们分开。有很多legacy code in scancodes
  • @NickA 酷我去看看

标签: c# keyboard controls modifier


【解决方案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 可以区分两个 alt 和两个控件。

但是,在 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

【讨论】:

  • 感谢您的回答。据我尝试,Win32 API 与 .NET 有同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
相关资源
最近更新 更多