残念ながら、Console.ReadKey はキーボード イベントしか処理できません。キーボード イベントは、(ConsoleKey 列挙で定義された実際のキーと「仮想」キーを使用して) キーボードで入力できるもののみを表すことができます。そのため、ReadKey を使用すると、キーボードのキーに対応する生のキー コードと、コンソールの入力コード ページで生のキー コードがマップされる Unicode 文字である変換された文字 (および各コード ページは最大 256 文字をマップできます)。ReadKey を使用して、他のタイプのデータ (つまり、直接入力できない文字や入力コード ページにマッピングされていない文字) を読み取ることはできません。
さらに、コンソールに Unicode 文字を貼り付けると、ReadKey によって使用される API が文字を Windows の ALT+nnn シーケンスに変換しようとします (つまり、ALT を押しながらキーパッドでコード ポイント番号を入力します)。残念ながら、最初に入力コード ページに定義されたルールを使用して文字を変換するため、コード ポイント番号を再構成しても、貼り付けられた実際の文字は取得されず、コード ページがマップする文字は取得されます。に。
Read または ReadLine を使用するとすべてが機能する理由は、これらがキーボード ベースではなくストリーム ベースのメソッドだからです。キーボードとコード ページの変換が行われないため、入力ストリームを介して任意の文字を入力できることは明らかです。ただし、ReadKey を使用して入力ストリームを直接取得することはできず、キーボードのみを使用します (入力ストリームがキーボード以外の場所からリダイレクトされた場合、ReadKey は完全に失敗します)。
P/Invoke でコンソール API を手動で使用する場合、入力ストリームを使用して ReadKey の「インターセプト」機能を複製する方法があるかもしれませんが、それは自明ではなく、コンソールは実際にはそのようなことを行うように設計されていません。だからあなたはおそらくずっとそれと戦っていたでしょう。
編集: とはいえ、独自のキーの組み合わせを実装して、キーボードから Unicode 文字を入力できるようにすることもできます。たとえば、CTRL + ALT + U を入力してから 4 つの 16 進数を入力するなどです。ReadKey ルーチンは CTRL + ALT を検出できます。 +U を押して、次の 4 つのキーストロークを取得し、それらから int を作成して char に変換しますが、もちろんこれでは貼り付けはできません。