众所周知,在大多数键盘国家布局中,右侧 Alt 键的功能相当于 AltGr。然而,AltGr并不是一个“真正的”键;它没有特定的 VirtualKeyCode/ScanCode,并且以编程方式,它的按下显示为两次单独的连续按下:
Stack Overflow 上的多个讨论与此相关,但到目前为止,没有人提出一种方法来以编程方式区分 AltGr 当前是否被按下,或者它是否是 LCtrl+RAlt 的组合。
同时,有理由相信这是可能的,因为 OSK(屏幕键盘,
C:\Windows\System32\osk.exe
)应用程序对它们进行了区分。通过试验按键并观察屏幕上相应的按键变化,可以轻松验证这一点。
因此,问题仍然存在:如何以编程方式区分 AltGr 和 LCtrl+RAlt?
我尝试观察按 AltGr 触发的事件序列,寻找 INPUT_RECORD 结构中的任何特征。
我还尝试通过
GetKeyState确定
VK_LCONTROL
、VK_RCONTROL
、VK_LMENU
、VK_RMENU
键的状态。但是,我没有找到任何特定于 AltGr 的内容可以将其与按 LCtrl+RAlt 区分开来。
尽管如此,屏幕键盘(OSK)以某种方式解决了这个问题。例如,您可以按下(并按住)Ctrl+AltGr,它将显示按键已被单独按下。
附注
请注意,Windows: Detect if right alt generated Ctrl+Alt (AltGr) in current layout有类似的问题。
但是,该问题略有不同:它询问如何辨别键盘布局是否将 RAlt 视为 AltGr。另一方面,我试图找出一些略有不同的东西。
右侧 Alt 键相当于 AltGr 键(与 Scancode 相同)。如果您没有正确的 Alt 键,则可以使用 Ctrl + Left Alt 来模拟 AltGr 组合键,并使用 Shift + Ctrl + Left Alt 来模拟 Windows 中的 Shift + AltGr 组合键。
您可以在英国键盘中进行测试。