К сожалению, Console.ReadKey может обрабатывать только события клавиатуры. События клавиатуры могут представлять только то, что можно набирать на клавиатуре (используя действительные и «виртуальные» клавиши, определенные в перечислении ConsoleKey). Таким образом, при использовании ReadKey вы получите только две вещи: необработанный код клавиши, который соответствует клавише на клавиатуре, и переведенный символ, то есть символ Unicode, с которым код необработанного ключа сопоставляется на кодовой странице ввода консоли (и каждая кодовая страница может отображать не более 256 символов). С помощью ReadKey вы не можете читать данные любого другого типа (а именно символы, которые не могут быть набраны напрямую и / или не имеют сопоставления во входной кодовой странице).
Более того, когда вы вставляете символ Unicode в консоль, API, используемый ReadKey, пытается преобразовать символ в последовательность Windows ALT + nnn (то есть, удерживая нажатой клавишу ALT и введите номер кодовой точки на клавиатуре). К сожалению, он сначала переводит символ, используя правила, определенные для входной кодовой страницы, поэтому даже если вы воссоздаете номер кодовой точки, вы не получите фактический вставленный символ, вы получите любой символ, который отображает кодовая страница. к.
Причина, по которой все работает при использовании Read или ReadLine, заключается в том, что они основаны на потоках, а не на клавиатуре. Очевидно, что любой символ может войти через поток ввода, так как не происходит перевод клавиатуры и кодовой страницы. Но вы не можете получить доступ к потоку ввода напрямую, используя ReadKey, только клавиатуру (и если поток ввода перенаправлен не с клавиатуры, ReadKey потерпит неудачу сразу).
Может быть какой-то способ реплицировать функциональность «перехват» ReadKey, используя поток ввода, если вы вручную используете API консоли с P / Invoke, но это будет нетривиально, и консоль на самом деле не предназначена для этого такого рода вещи, так что вы, вероятно, будете бороться с этим весь путь.
Edit: все это говорит о том, что вы все равно можете реализовать свои собственные комбинации клавиш, чтобы позволить вводить символы Unicode с помощью клавиатуры - например, типа CTRL + ALT + U и затем четырех шестнадцатеричных цифр - ваша процедура ReadKey могла обнаружить CTRL + ALT + U, а затем захватить следующие четыре нажатия клавиш, сделать из них целое число и преобразовать его в символ - но, конечно, это не позволит вставить.