GetKeyNameText数字键盘缺少文本

因此,我尝试使用{/ {1}}获取按下的键的名称,使用原始输入给出的make / scan代码和扩展键标志:

// Created a JsonSerializerSettings and passed it to DeserializeObject

var jsonSettings = new JsonSerializerSettings { Error = ErrorHandler };
JsonConvert.DeserializeObject<ParkingOfferDetailsDTO>(responseJson,jsonSettings);

/// actual handler method
        List<string> errors = new List<string>();
        private void ErrorHandler(object sender,ErrorEventArgs e)
        {
            errors.Add(e.ErrorContext.Error.Message);
            e.ErrorContext.Handled = true;
        }

这对于大多数键都有效,但是GetKeyNameText(扫描代码53)和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); } (扫描代码55)给出错误的结果:它们都给出字符串“(ZEHNERTASTATUR)”(德语键盘)布局,因此英语为“ Num”)-因此名称中缺少Num /Num *

我已经用两个不同的键盘测试了这个结果,结果相同(使用Windows 10 btw),我是否缺少某些东西?为什么这两个键的名称不正确?

poboco 回答:GetKeyNameText数字键盘缺少文本

这是Windows中存在的错误,已经存在了很长时间,并且仍然存在。

在此article by M. Kaplan from 2012中,他解释了Windows中访问键名的混乱状态。不过,在这方面似乎没有太多改进。

键名以专有格式存储为.data并存储在已编译的键盘布局文件中,这些文件是DLL,位于其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 * 时,会发生这种情况。 kbd>:

enter image description here

恐怕您要么不得不忍受它,要么维护自己的修复程序列表以应用于所获取的损坏信息,或者完全自己的键名列表以及相应的翻译……这就是其他应用程序似乎也可以做到,例如VS Code。

(当然,如果这只影响您或少数人,您可以使用Microsoft Keyboard Layout Creator创建自定义键盘布局的长度,并在那里正确设置名称,但这可能会造成过多的附带损害(例如Microsoft帐户设置同步问题),不值得。

本文链接:https://www.f2er.com/3140297.html

大家都在问