我有一个小C#控制台应用程序,它读取密钥并检查密钥是否是问号:
ConsoleKeyInfo ki = System.Console.ReadKey();
if (ki.ConsoleKey.Oem2) // Do something
我通过查看调试器中实际分配的值来到Oem2
,因为问号没有ConsoleKey code。
现在我当然可以使用ki.KeyChar
,但应用程序还需要响应不映射到字符的某些键(例如媒体键)。检查ConsoleKey
和KeyChar
以确定实际上已按下哪个键感觉不太优雅。另一方面,依靠Oem2
在所有情况和地区始终映射到?
并不安全。
最佳做法是检查两个属性以确定实际按下了哪个键?
对于为什么以这种方式设计ConsoleKeyInfo的任何见解都表示赞赏。
答案 0 :(得分:6)
在这种情况下,您必须检查KeyChar == '?'
。来自MSDN:
Oem2:OEM 2密钥(OEM特定)。
所以你很幸运,因为它恰好是你设备上的?
。
ConsoleKeyInfo
结构提供KeyChar
(Char
值)以及Modifiers
(枚举),以帮助您确定用户按下了哪些键。
答案 1 :(得分:2)
我认为你应该考虑当有人有不同的键盘布局时会发生什么。
如果要检查“我的计算机上带有问号的密钥”,请使用ConsoleKey
。但这可能不是一个好主意,您可能应该遵守用户的设置并使用KeyChar
。
但对于未映射到字符的键(并且用户无法使用不同的键盘布局重新映射它们),您必须使用ConsoleKey
。
所以,是的,我认为在这种情况下你应该检查两个属性。
答案 2 :(得分:2)
我想这个设计的原因是Console.ReadKey()
依赖于本机函数(ReadConsoleInput),它在按键的情况下返回KEY_EVENT_RECORD结构数组,其中每个键事件具有ASCII / Unicode字符表示和virtual key code。请注意我之前链接中的VK_OEM_2 - 这是ConsoleKey.Oem2
值的来源。