【问题标题】:ConsoleKeyInfo, the Question Mark and PortabilityConsoleKeyInfo、问号和可移植性
【发布时间】:2012-02-28 20:22:04
【问题描述】:

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

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

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

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

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

感谢您了解为何以这种方式设计 ConsoleKeyInfo。

【问题讨论】:

    标签: c# .net console-application


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      我认为您应该考虑当某人使用不同的键盘布局时会发生什么。

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多