由于我对这个问题的兴趣我没有使用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 Alt
和Right Alt
。我建议你看看this answer并改用Win32 API。
还要注意,Right Alt
是Alt Gr
。
Alt Gr是德语键盘上经常使用的键。它用于编写“@”,“€”,“\”,“〜”和其他几个字符 – Generator
@NickA不感兴趣,是否在扫描代码上的扩展位相同? – stuartd
@NickA在扫描码上有一个扩展位,左右两个都是0x38,但左边的扩展位是'0',右边是'0xE0',这就是你如何区分它们的方法。有很多[scancode中的遗留代码](https://blogs.msdn.microsoft.com/oldnewthing/20080211-00/?p=23503/)! – stuartd