2012-02-28 98 views
8

我有一个小C#控制台应用程序读取的关键,并检查是否的关键是一个问号:ConsoleKeyInfo,问号和可移植性

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

我在Oem2通过看什么样的价值实际上是抵在调试器中分配,因为问号没有ConsoleKey code

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

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

任何洞察为什么ConsoleKeyInfo是这样设计的赞赏。

回答

6

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

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

所以你只是幸运的,它恰好是你的设备上的?

ConsoleKeyInfo结构提供了KeyChar(一个Char值)以及Modifiers(枚举)来帮助您确定用户按下了哪些键。

2

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

如果您想查询“我的电脑上有问号的钥匙”,则请使用ConsoleKey。但这可能不是一个好主意,你应该坚持用户的设置并使用KeyChar

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

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

2

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