2012-02-28 4 views
8

У меня есть немного C# консольное приложение, которое считывает ключ и проверяет, является ли ключ был знак вопроса:ConsoleKeyInfo, вопросительный знак и портативность

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

Я прибыл в Oem2, видя, что значение на самом деле назначенный в отладчике, потому что для вопросительного знака нет ConsoleKey code.

Теперь я мог бы использовать ki.KeyChar, но приложение также должно отвечать на определенные клавиши (например, медиа-ключи), которые не отображаются на символы. Для определения того, какой ключ на самом деле был нажат, необходимо проверить как ConsoleKey, так и KeyChar. С другой стороны, не стоит полагаться на Oem2, чтобы всегда отображаться на ? во всех обстоятельствах и регионах.

Рекомендуется ли проверять оба свойства, чтобы определить, какая клавиша была нажата?

Любое понимание того, почему ConsoleKeyInfo было разработано таким образом, оценено.

ответ

6

В этом случае вам необходимо будет проверить KeyChar == '?'. От MSDN:

Oem2: Ключ OEM 2 (для OEM).

Значит, вам просто повезло, что на вашем оборудовании находится ?.

ConsoleKeyInfo структура обеспечивает KeyChar (значение Char), а также Modifiers (перечисление), чтобы помочь вам решить, какие клавиши нажал пользователь.

2

Я думаю, вы должны подумать о том, что происходит, когда у кого-то есть разная раскладка клавиатуры.

Если вы хотите проверить «ключ с вопросительным знаком на мой компьютер», используйте ConsoleKey. Но это, вероятно, не очень хорошая идея, и вы, вероятно, должны придерживаться настроек пользователя и использовать KeyChar.

Но для ключей, которые не сопоставляются с символами (и пользователь не может переназначить их, используя различную раскладку клавиатуры), вы должны использовать ConsoleKey.

Итак, да, я думаю, вы должны проверить оба свойства в этом случае.

2

Я предполагаю, что причина этой конструкции является то, что Console.ReadKey() полагается на родную функции (ReadConsoleInput), который возвращает массив KEY_EVENT_RECORD структур в случае нажатия клавиши, где каждое ключевое событие имеет/Unicode представление символов ASCII и virtual key code. Обратите внимание на VK_OEM_2 в моей предыдущей ссылке - вот откуда берется значение ConsoleKey.Oem2.

Смежные вопросы