К сожалению, Console.ReadKey способен обрабатывать события клавиатуры. События клавиатуры могут представлять только то, что можно ввести на клавиатуре (используя реальные и «виртуальные» ключи, определенные в перечислении ConsoleKey). Поэтому при использовании ReadKey вы получите только две вещи: код исходного кода, который соответствует ключу на клавиатуре, и переведенный символ, который является символом Unicode, который код сырого ключа отображается на входной кодовой странице консоли (и каждая кодовая страница может отображать максимум 256 символов). Вы не можете читать какие-либо другие типы данных (а именно символы, которые не могут быть непосредственно введены и/или не иметь сопоставление на странице ввода кода) с помощью ReadKey.
Кроме того, когда вы вставляете символ Unicode в консоль, API, используемый ReadKey, пытается перевести символ в последовательность ALT + nnn Windows (т. Е. Удерживайте ALT и введите номер кодовой точки на клавиатуре). К сожалению, сначала он преобразует символ, используя правила, определенные для входной кодовой страницы, поэтому, даже если вы восстановите номер кодовой точки, вы не получите фактический персонаж, который был вставлен, вы получите любой символ, который будет отображать на кодовой странице к.
Причина все это работает при использовании Read или ReadLine, что это поток на основе, а не с клавиатурой на основе, методов. Очевидно, любой персонаж может войти через входной поток, так как нет перевода клавиатуры и кодовой страницы. Но вы не можете получить входной поток напрямую, используя ReadKey, только клавиатуру (и если входной поток был перенаправлен откуда-то, кроме клавиатуры, ReadKey завершится неудачно).
Возможно, существует какой-то способ репликации функции «перехвата» ReadKey с использованием входного потока, если вы вручную используете API-интерфейс консоли с P/Invoke, но это было бы нетривиально, и консоль на самом деле не предназначена для выполнения такого рода вещи, чтобы вы, вероятно, сражались с ним целиком.
Edit: Все, что сказал, вы могли бы еще реализовать свои собственные комбинации клавиш, чтобы символы Unicode для ввода с клавиатуры - например, как тип CTRL + ALT + U, а затем четыре шестнадцатеричные цифры - ваш ReadKey рутина могла обнаружить CTRL + ALT + U, а затем захватить следующие четыре нажатия клавиш и сделать из них int и преобразовать их в символ, но, конечно, это не допустило бы вставки.
Да, вы ожидали бы этого, но он не возвращает Unicode, работает только для ASCII. – leppie 2008-11-29 13:54:09