2017-03-17 52 views
2

德国键盘有一个名为“Alt Gr”的键。它看起来像窗户看起来像按alt + ctrl。AltGr vs LeftCtrl

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

有没有办法

用户按下之间
  • 区分: “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”。

+0

Alt Gr是德语键盘上经常使用的键。它用于编写“@”,“€”,“\”,“〜”和其他几个字符 – Generator

+0

@NickA不感兴趣,是否在扫描代码上的扩展位相同? – stuartd

+0

@NickA在扫描码上有一个扩展位,左右两个都是0x38,但左边的扩展位是'0',右边是'0xE0',这就是你如何区分它们的方法。有很多[scancode中的遗留代码](https://blogs.msdn.microsoft.com/oldnewthing/20080211-00/?p=23503/)! – stuartd

回答

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可以区分两个控制器和两个控制器。

然而,在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

+0

谢谢你的回答。就我所知,Win32 API与.NET相比有相同的问题。 – Generator

相关问题