Biz*_*rus 6 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);
}
Run Code Online (Sandbox Code Playgroud)
这对大多数键都很有效,但是,Num /(扫描代码 53)和Num *(扫描代码 55)给出了错误的结果:它们都给出了字符串“(ZEHNERTASTATUR)”(德语键盘布局,英语中的“Num”也是如此) – 所以的/或*丢失的名字。
我已经用两个不同的键盘对此进行了测试,结果相同(使用 Windows 10 顺便说一句),我错过了什么吗?为什么这两个键没有正确的名称?
这是 Windows 中存在多年且仍然存在的错误。
在M. Kaplan 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)
...
Run Code Online (Sandbox Code Playgroud)
我们可以通过在十六进制编辑器中查看它来验证这不是strings启发式确定字符串开头和结尾的错误:
正如您所看到的,文件中根本不存在*或根本不存在。/
因此,您似乎一直被 Windows 给您带来的坏名声所困扰。(顺便说一句,其他语言中也存在错误。)甚至 Windows shell 本身也存在此问题,例如,当我打开快捷方式的属性并尝试将热键设置为Num *:
恐怕您要么必须忍受它,要么维护自己的修复列表以应用于您获得的损坏信息,或者您自己的单独的键名列表,并带有相应的翻译......这就是其他应用程序的样子要做的事情,例如 VS Code。
(当然,如果这仅影响您或一小部分人,您可以使用Microsoft Keyboard Layout Creator来创建自定义键盘布局并正确设置名称,但这可能会造成太大的附带损害(例如Microsoft 帐户设置同步问题)是值得的。)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |