ConsoleKeyInfo,问号和可移植性

时间:2012-02-28 20:22:05

标签: c# .net console-application

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

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

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

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

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

对于为什么以这种方式设计ConsoleKeyInfo的任何见解都表示赞赏。

3 个答案:

答案 0 :(得分:6)

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

  

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

所以你很幸运,因为它恰好是你设备上的?

ConsoleKeyInfo结构提供KeyCharChar值)以及Modifiers(枚举),以帮助您确定用户按下了哪些键。

答案 1 :(得分:2)

我认为你应该考虑当有人有不同的键盘布局时会发生什么。

如果要检查“我的计算机上带有问号的密钥”,请使用ConsoleKey。但这可能不是一个好主意,您可能应该遵守用户的设置并使用KeyChar

但对于未映射到字符的键(并且用户无法使用不同的键盘布局重新映射它们),您必须使用ConsoleKey

所以,是的,我认为在这种情况下你应该检查两个属性。

答案 2 :(得分:2)

我想这个设计的原因是Console.ReadKey()依赖于本机函数(ReadConsoleInput),它在按键的情况下返回KEY_EVENT_RECORD结构数组,其中每个键事件具有ASCII / Unicode字符表示和virtual key code。请注意我之前链接中的VK_OEM_2 - 这是ConsoleKey.Oem2值的来源。