Windows中的某些键盘布局(例如US-QWERTY)将右Alt视为常规Alt键,而其他键盘布局(例如US International)将其视为AltGr并在按下时生成Ctrl和Alt。Microsoft Keyboard Layout Creator提供了“右Alt视为Ctrl+Alt(也称为AltGr)”选项来确定给定布局使用的模式。
在Windows上有没有一种方法可以通过编程方式确定当前活动键盘布局处理右Alt键的方式?
Windows 10中的屏幕键盘似乎区分了这两个键(根据布局将键标记为“Alt”或“AltGr”),但我不确定它是通过公共API、通过与操作系统的更深层次的挂钩,还是仅仅通过了解Windows附带的布局来确定这一点。
2条答案
按热度按时间k2arahey1#
VkKeyScanExW
function具有以下返回值:类型:
SHORT
如果函数成功,则返回值的低位字节包含虚拟键代码,高位字节包含移位状态,移位状态可以是以下标志位的组合。
如果函数找不到转换为传递的字符代码的键,则低位字节和高位字节都包含
–1
。...对于使用右手ALT键作为shift键的键盘布局(例如,法语键盘布局),shift状态由值
6
表示,因为右手ALT* 键在内部转换为 CTRL+ALT。此函数将字符转换为相应的虚拟键代码和Shift状态。此函数使用输入法区域设置标识符所标识的输入法语言和物理键盘布局来转换字符。
不幸的是,我不知道反函数(使用输入语言和物理键盘布局将虚拟键代码和状态转换为相应的字符)。
在以下PowerShell脚本
58633725_RightAltFinder.ps1
中定义的函数Get-KeyboardRightAlt
针对特定的换档状态6
(其对应于RightAlt)以及针对任何 installed 输入区域设置标识符应用强力方法来模拟这样的反函数:检查VkKeyScanExW
输出中的每个可能字符(Unicode范围从U+0020
到U+FFFD
)。输出。函数返回以下任一值
true
,否则为false
),或-all
开关)包含具有以下属性的完整RightAlt+?列表的对象:VkKey
-(用于调试),Unicode
-合成字符的码点,Char
-结果字符本身,RightAltKey
-按住RightAlt键时按下的字符。当然,有时候某些布局中的结果字符可能是死键,比如下面Russian example中的分音符(
¨
)。一个二个二个一个一个三个一个一个一个四个一个一个一个一个五个一个一个一个一个一个六个一个一个一个一个七个一个
另一个问题是确定 * 当前活动的键盘布局 *。以下PowerShell脚本声明
Get-KeyboardLayoutForPid
函数,该函数可以可靠地获取任何进程的当前Windows键盘布局(在this my answer中描述):dsekswqp2#
如果没有这样的API,可以直接给予你信息.
但是你可以尝试用一种困难的方法。正如你已经发现AltGr在Windows中实际上是Ctrl+Alt。你可以为0x00..0x7f范围内的每个扫描代码调用ToUnicodeEx,
VK_MENU
+VK_CONTROL
设置为lpKeyState
数组中的0x80
,以确定键盘布局是否Map了AltGr。有关详细信息,请参阅迈克尔·S·卡普兰的Getting all you can out of a keyboard layout, Part #5。
另外还有info on AltGr here。