繁体   English   中英

ConsoleKeyInfo,问号和可移植性

[英]ConsoleKeyInfo, the Question Mark and Portability

我有一个小C#控制台应用程序,它读取密钥并检查密钥是否是问号:

ConsoleKeyInfo ki = System.Console.ReadKey();
if (ki.ConsoleKey.Oem2) // Do something

我通过查看调试器中实际分配的值来到达Oem2 ,因为没有用于问号的ConsoleKey代码

现在我当然可以使用ki.KeyChar ,但应用程序还需要响应不映射到字符的某些键(例如媒体键)。 检查ConsoleKeyKeyChar以确定实际上已按下哪个键感觉不太优雅。 另一方面,依靠Oem2总是映射到它是不安全的? 在所有情况和地区。

检查两个属性以确定实际按下了哪个键是最佳做法吗?

任何洞察为什么ConsoleKeyInfo以这种方式设计是值得赞赏的。

在这种情况下,你必须检查KeyChar == '?' 来自MSDN

Oem2:OEM 2密钥(OEM特定)。

所以你真的很幸运,因为它恰好是一个? 在你的设备上。

ConsoleKeyInfo结构提供KeyCharChar值)和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM