2012-02-28 11 views
8

私は鍵が疑問符だったかどうかを確認するために、キーとチェックを読み込み、少しC#コンソールアプリケーションを持っている:のConsoleKeyInfo、疑問符と移植

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

私は、値が実際に何であるか見てOem2に到着しました疑問符はConsoleKey codeではないため、デバッガで割り当てられています。

ここでは確かにki.KeyCharを使用できますが、アプリケーションは文字にマップされない特定のキー(メディアキーなど)にも応答する必要があります。実際にどのキーが押されたのかを確認するには、ConsoleKeyKeyCharの両方をチェックするのが面倒です。一方、すべての状況と地域で常にに頼って?にマップするのは安全ではありません。

両方のプロパティを確認して、どのキーが実際に押されたかを確認することをお勧めしますか?

ConsoleKeyInfoがこのように設計された理由についての洞察は高く評価されます。

答えて

6

この場合、KeyChar == '?'をチェックする必要があります。からMSDN

Oem2:OEM 2キー(OEM固有)。

あなたの機材には?ということが起こっているだけで幸運です。

構造体KeyCharCharの値)とModifiers(列挙型)は、ユーザーが押したキーを決定するのに役立ちます。

2

私はあなたが別のキーボードレイアウトを持っているときに何が起こるかを考えるべきだと思います。

私のコンピュータに疑問符を含むキー」をチェックする場合は、ConsoleKeyを使用してください。しかし、これはおそらく良い考えではないので、おそらくユーザの設定に従ってKeyCharを使用してください。

しかし、文字にマップされていないキー(ユーザーは異なるキーボードレイアウトを使用してマップすることはできません)では、ConsoleKeyを使用する必要があります。

はい、私はこの場合両方のプロパティを確認する必要があります。

2

私は、この設計の理由はConsole.ReadKey()は、各キーイベントがASCII/Unicode文字表現とvirtual key codeを持っているキープレスの場合にKEY_EVENT_RECORD構造体の配列を返すネイティブ関数(ReadConsoleInput)に依存しているということだと思います。前のリンクのVK_OEM_2に注目してください。これはConsoleKey.Oem2の値です。