2012-02-28 22 views
8

que tienen una pequeña aplicación de consola de C# que lee una clave y comprueba si la clave era un signo de interrogación:ConsoleKeyInfo, el signo de interrogación y Portabilidad

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

llegué a Oem2 por ver qué valor es en realidad asignado en el depurador, porque no hay ConsoleKey code para el signo de interrogación.

Ahora podría usar ki.KeyChar en su lugar, pero la aplicación también debe responder a ciertas teclas (por ejemplo, teclas de medios) que no se asignan a los caracteres. No es elegante comprobar ConsoleKey y KeyChar para determinar qué tecla se ha pulsado. Por otro lado, no se siente seguro confiar en Oem2 para mapear siempre a ? en todas las circunstancias y regiones.

¿Es recomendable marcar ambas propiedades para determinar qué tecla se ha pulsado?

Se aprecia cualquier idea sobre por qué se diseñó ConsoleKeyInfo de esta manera.

Respuesta

6

En este caso, deberá marcar KeyChar == '?'. De MSDN:

Oem2: La clave OEM 2 (OEM específico).

Así que estás teniendo suerte en el hecho de que es ? en tu equipo.

La estructura ConsoleKeyInfo ofrece KeyChar (un valor Char), así como Modifiers (una enumeración) para ayudar a decidir qué teclas que el usuario ha pulsado.

2

Creo que deberías considerar lo que sucede cuando alguien tiene un diseño de teclado diferente.

Si desea verificar "la clave con signo de interrogación en mi computadora", utilice ConsoleKey. Pero probablemente esta no sea una buena idea y probablemente deba cumplir con la configuración del usuario y usar KeyChar.

Pero para las teclas que no se asignan a los caracteres (y el usuario no puede reasignarlas mediante el uso de diferentes diseños de teclado), debe usar ConsoleKey.

Entonces, sí, creo que debería verificar ambas propiedades en este caso.

2

supongo que la razón de este diseño es que Console.ReadKey() se basa en una función nativa (ReadConsoleInput) que devuelve una matriz de KEY_EVENT_RECORD estructuras en caso de una pulsación de tecla, donde cada evento clave tiene una representación de caracteres ASCII/Unicode y un virtual key code. Observe el VK_OEM_2 en mi enlace anterior; de ahí viene el valor ConsoleKey.Oem2.

Cuestiones relacionadas