强制 GetKeyNameText 为英文
Win32 函数 GetKeyNameText
将提供当前输入区域设置中键盘按键的名称。
来自 MSDN:
按键名称根据当前的布局进行翻译 安装的键盘,因此该函数可能会给出不同的结果 不同的输入区域设置。
是否可以在短时间内强制输入区域设置?或者是否有另一个替代 GetKeyNameText
的方法,始终返回英文名称?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
更新:这个答案不起作用。它实际上修改了用户的键盘设置。这似乎是 Windows 版本之间的行为变化。
Update: This answer does not work. It actually modifies the keyboard settings of the user. This appear to be a behavior change between Windows versions.
警告:GetKeyNameText 已损坏(它会为非英语键盘布局返回错误的 AZ 键名称,因为它使用 MapVirtualKey 与MAPVK_VK_TO_CHAR 已损坏)。我根本不建议使用这种方法。 :)
您可以使用此表< /a> 将扫描代码映射到 HID 使用代码和 HID 使用名称:
0x54
0xE046
0x45
0xE045
OR 如果您真的非常想从键盘布局获取此信息 - 那么您可以从布局 dll 文件(kbdus.dll、kbdger.dll 等)手动加载和解析它)。
这里涉及到一堆未记录的内容:
KLID
字符串(键盘布局 id,请参阅 此处查看列表)。美国英语是00000409
。如果您有 HKL(来自 GetKeyboardLayout 或 WM_INPUTLANGCHANGE),则可以使用以下代码将其转换为 KLID 字符串:然后使用
KLID
字符串,您需要转到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%KLID%
注册表路径并从中读取布局文件
字符串。使用
LoadLibrary()
从SHGetKnownFolderPath(FOLDERID_System, ...)
(通常C:\Windows\System32
)加载此 dll 文件打电话。接下来您需要执行
GetProcAddress(KbdDllHandle, "KbdLayerDescriptor")
- 您将收到可以转换为PKBDTABLES
的指针。Windows SDK 中有一个
kbd.h
标头,其中包含KBDTABLES
结构定义(涉及到为在 x64 Windows 上运行的 x32 代码使用正确的 KBD_LONG_POINTER 大小的一些内容。请参阅最后我的 Gtk 源代码链接)。您必须查看其中的
pKeyNames
和pKeyNamesExt
才能获取扫描代码
->键名
映射。长话短说:GTK 工具包具有完成所有这些操作的代码(请参阅此处 和 此处)。实际上他们正在构建扫描码 ->从 Windows 键盘布局 dll 打印字符表。
WARNING: GetKeyNameText is broken (it returns wrong A-Z key names for non-english keyboard layouts since it uses MapVirtualKey with MAPVK_VK_TO_CHAR that is broken). I cannot recommend dealing with this method at all. :)
You can use this table to map scan code to HID Usage codes and HID Usage Names:
0x54
0xE046
0x45
0xE045
OR if you're really-really want to get this info from keyboard layout - then you can load and parse it manually from layout dll file (kbdus.dll, kbdger.dll etc).
There is a bunch of undocumented stuff involved:
KLID
string (keyboard layout id, see here for the list). US English is00000409
. If you haveHKL
(fromGetKeyboardLayout
orWM_INPUTLANGCHANGE
) then you can convert it toKLID
string with such code:Then with
KLID
string you need to go toHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%KLID%
registry path and readLayout File
string from it.Load this dll file from
SHGetKnownFolderPath(FOLDERID_System, ...)
(usuallyC:\Windows\System32
) withLoadLibrary()
call.Next you need to do
GetProcAddress(KbdDllHandle, "KbdLayerDescriptor")
- you're receive pointer that can be casted toPKBDTABLES
.There is
kbd.h
header in Windows SDK that haveKBDTABLES
struct definition (there is some stuff involved to use proper KBD_LONG_POINTER size for x32 code running on x64 Windows. See my link to Gtk source at the end).You have to look at
pKeyNames
andpKeyNamesExt
in it to getscan code
->key name
mapping.Long story short: The GTK toolkit have the code that doing all this(see here and here). Actually they are building scan code -> printed chars tables from Windows keyboard layout dlls.