2010-05-24 12 views
11

¿Cómo puedo convertir la tecla de barra inclinada invertida ('\') en el código de tecla?Cómo convertir un carácter a código clave?

En mi código de barra invertida teclado es 220, pero el método de abajo

(int)'\\' 

me devuelve 92.

necesito algo de conversión genérica como

int ConvertCharToKeyValue(char c) 
{ 
    // some code here... 
} 

¿Alguna idea?

+0

¿Alguna vez resolvió esto con éxito? ¿Aún necesitas ayuda con esto? – jcolebrand

+0

¿Has visto esta respuesta? http://stackoverflow.com/questions/318777/c-how-to-translate-virtual-keycode-tochar – jcolebrand

+0

Sí. Necesito convertir de char a int. Y necesito una solución independiente de la plataforma. Sin WM_Messages ... –

Respuesta

0

No hay una función que conozca que asigne un carácter a un código de tecla virtual. Sin embargo, puede usar la siguiente tabla para comenzar a construir dicha asignación.

http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx.

Tenga en cuenta que necesitará saber el teclado, mirando la tecla que menciona '\' esta es la clave virtual VK_OEM_5 que para teclados de EE. UU. Es '\' si no está desplazada y '|' si se desplaza, su función necesitará saber también que el teclado está siendo utilizado.

Por supuesto, si desea asignar un código de tecla virtual a un carácter, puede usar interop para llamar a la función MapVirtualKeyEx.

Actualización Según su comentario, esto le daría lo que quiere.

[DllImport("user32.dll")] 
static extern int MapVirtualKey(int uCode, uint uMapType); 

const uint MAPVK_VK_TO_CHAR = 0x02; 

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    int key = MapVirtualKey((int)e.KeyCode, MAPVK_VK_TO_CHAR); 
    if (key == (int)'\\') 
    { 

    } 
} 
+0

Gracias por el enlace.Leí: VK_OEM_5: 0xDC: 220 Utilizado para caracteres misceláneos; puede variar según el teclado. ~~~~~~~~~~~~~~~~~~~~~~~ Para el teclado estándar de EE. UU., El '\ |' clave Necesito la solución independiente del teclado. Probablemente la mejor solución será algo como: TextBox_KeyDown public void (object sender, KeyEventArgs e) { if ((String.Parse (e.KeyCode) .EndsWith ("\\")) ... } –

+0

@Murat, no hay función String.Parse(). He agregado una muestra que debería ayudar con lo que parezca querer hacer aquí. –

16

Puede P/Invocar VkKeyScan() para convertir un código de tecla de escritura de nuevo en una tecla virtual. Tenga en cuenta que el estado de la tecla modificadora es importante, obteniendo "|" requiere mantener presionada la tecla Mayús en el diseño de mi teclado. Su firma función no permite esto algo tan acabo de componer:

public static Keys ConvertCharToVirtualKey(char ch) { 
     short vkey = VkKeyScan(ch); 
     Keys retval = (Keys)(vkey & 0xff); 
     int modifiers = vkey >> 8; 
     if ((modifiers & 1) != 0) retval |= Keys.Shift; 
     if ((modifiers & 2) != 0) retval |= Keys.Control; 
     if ((modifiers & 4) != 0) retval |= Keys.Alt; 
     return retval; 
    } 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern short VkKeyScan(char ch); 

También tenga cuidado con las disposiciones de teclado que necesitan utilizar las teclas muertas (Alt + Gr) para generar claves de mecanografía. Este tipo de código es mejor evitarlo.

1

Si

var char = System.Windows.Forms.Keys.OemPipe; // 220 
var code = (int)char; 

continuación

public static int ToKeyValue(this char ch) 
{ 
    return (int)(System.Windows.Forms.Keys)ch; 
} 
+0

Tenía la impresión de que 'OemPipe' sería' | 'y' OemBackslash' sería '\\' – Powerlord

+0

@ R. Bemrose: Sí, lo sería. Pero cuando presiono '\' en el teclado (que está en Retroceso y encima de Enter) mi cuadro de texto de prueba dispara el evento 'KeyUp' donde' KeyCode = 220' que OP está buscando – abatishchev

0

O puede que sea sencillo y lanzarlo.

(Keys)keyToConvert 
Cuestiones relacionadas