[英]ConsoleKeyInfo, the Question Mark and Portability
我有一个小C#控制台应用程序,它读取密钥并检查密钥是否是问号:
ConsoleKeyInfo ki = System.Console.ReadKey();
if (ki.ConsoleKey.Oem2) // Do something
我通过查看调试器中实际分配的值来到达Oem2
,因为没有用于问号的ConsoleKey代码 。
现在我当然可以使用ki.KeyChar
,但应用程序还需要响应不映射到字符的某些键(例如媒体键)。 检查ConsoleKey
和KeyChar
以确定实际上已按下哪个键感觉不太优雅。 另一方面,依靠Oem2
总是映射到它是不安全的?
在所有情况和地区。
检查两个属性以确定实际按下了哪个键是最佳做法吗?
任何洞察为什么ConsoleKeyInfo以这种方式设计是值得赞赏的。
在这种情况下,你必须检查KeyChar == '?'
。 来自MSDN :
Oem2:OEM 2密钥(OEM特定)。
所以你真的很幸运,因为它恰好是一个?
在你的设备上。
ConsoleKeyInfo
结构提供KeyChar
( Char
值)和Modifiers
(枚举),以帮助您确定用户按下了哪些键。
我认为你应该考虑当有人有不同的键盘布局时会发生什么。
如果要检查“ 我的计算机上带有问号的密钥”,请使用ConsoleKey
。 但这可能不是一个好主意,你应该坚持用户的设置并使用KeyChar
。
但是对于未映射到字符的键(并且用户无法使用不同的键盘布局重新映射它们),您必须使用ConsoleKey
。
所以,是的,我认为在这种情况下你应该检查两个属性。
我想这个设计的原因是Console.ReadKey()
依赖于一个本机函数( ReadConsoleInput ),它在keypress的情况下返回一个KEY_EVENT_RECORD结构数组,其中每个键事件都有一个ASCII / Unicode字符表示和一个虚拟键代码 。 请注意我之前链接中的VK_OEM_2 - 这是ConsoleKey.Oem2
值的来源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.