c++ - GetKeyNameText 小键盘缺少文本

标签 c++ windows winapi raw-input

我正在尝试使用 GetKeyNameText 获取按键的名称,使用原始输入给出的生成/扫描代码和扩展键标志:

std::wstring GetKeyName(const RAWKEYBOARD& info)
{
    WCHAR n[128];
    const int l = GetKeyNameTextW((info.MakeCode << 16) | ((info.Flags & RI_KEY_E0) != 0 ? 1 << 24 : 0), n, ARRAYSIZE(n));
    if(l == 0) { return L""; }
    return std::wstring(n);
}
这适用于大多数键,但是,Num/(扫描代码 53)和 Num *(扫描代码 55)给出了错误的结果:它们都给出了字符串“(ZEHNERTASTATUR)”(德语键盘布局,因此“Num”在英语) – 所以 /*名称中缺少。
我已经用两个不同的键盘对此进行了测试,结果相同(使用 Windows 10 顺便说一句),我错过了什么吗?为什么这两个键没有正确的名称?

最佳答案

这是 Windows 中存在多年并且仍然存在的错误。
在此 article by M. Kaplan from 2012他解释了在 Windows 中访问键名的困惑状态。不过在这方面似乎没有太大的改进。
键名存储在编译的键盘布局文件中,这些文件是 DLL,在它们的 .data 中。部分以专有格式导出为 KbdLayerDescriptor .德语键盘布局存储在 C:\Windows\System32\KBDGR.DLL 中.如果您使用 strings 实用程序,你会得到这个(是的,顺序很奇怪):

...
NACH-LINKS
^ZIRKUMFLEX
NACH-RECHTS
STRG-RECHTS
LINKE WINDOWS
NUM-FESTSTELL
RECHTE WINDOWS
BILD-NACH-OBEN
BILD-NACH-UNTEN
UMSCHALT RECHTS
ROLLEN-FESTSTELL
 (ZEHNERTASTATUR)      <<<<<< THE ISSUE EXISTS
 (ZEHNERTASTATUR)      <<<<<< HERE AS WELL!
0 (ZEHNERTASTATUR)
3 (ZEHNERTASTATUR)
2 (ZEHNERTASTATUR)
1 (ZEHNERTASTATUR)
+ (ZEHNERTASTATUR)
6 (ZEHNERTASTATUR)
5 (ZEHNERTASTATUR)
4 (ZEHNERTASTATUR)
...
我们可以验证这不是一个错误 strings ' 启发式通过在十六进制编辑器中查看字符串来确定字符串的开头和结尾:
enter image description here
如您所见,没有 */完全存在于文件中。
所以看起来你被 Windows 给你的坏名字所困扰。 (顺便说一句,其他语言中也存在错误。)即使是 Windows shell 本身也会出现此问题,例如,当我打开快捷方式的属性并尝试将热键设置为 Num * 时会发生这种情况:
enter image description here
恐怕您要么不得不忍受它,要么维护自己的修复列表以应用于您获得的损坏信息,或者您自己单独的完整 key 名称列表,并带有相应的翻译......这就是其他应用程序的样子做,例如VS Code。
(当然,如果这仅影响您或少数人,您可以使用 Microsoft Keyboard Layout Creator 创建自定义键盘布局并在那里正确设置名称,但这可能会导致过多的附带损害(例如 Microsoft帐户设置同步问题)值得。)

关于c++ - GetKeyNameText 小键盘缺少文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58760357/

相关文章:

c++ - IFileDialog 与 C 兼容吗?

c - 你如何检查一个目录是否存在于 C 的 Windows 上?

performance - IO 其他操作性能计数器说明

c++ - MFC:在派生的 CEdit 中没有收到 EN_CHANGE 消息

c++ - 是否可以为 FindFirstFile() 函数使用引号?

c++ - 与 Linux 上的 DB2 ODBC 驱动程序链接

windows - 在Windows上重新启动Electron应用程序

c# - 获取应用程序ID

c++ - IBM MQ 升级导致错误 2059 和错误 2018

c++ - `int a = 0, b = a` 是否有未定义的行为?