Convertir carácter a clave virtual

Tengo una cadena de valores, y quiero simular eventos de pulsación de tecla en una ventana para cada personaje.

Planeo enviar a la ventana los eventos WM_KEYDOWN , WM_CHAR y WM_KEYUP (ya que eso es lo que parece ocurrir cuando se presiona una tecla manualmente).

Esos mensajes requieren que se envíe un int en el wParam en función de una tabla de códigos de clave virtual . Puedo recorrer la cadena y obtener cada carácter, pero ¿cómo tomo ese carácter y lo convierto en un valor que corresponde al código de tecla virtual? Convert.ToInt32 () no funciona.

Enviar WM_KEYDOWN / UP es problemático. La propia aplicación ya traduce el mensaje WM_KEYDOWN a WM_CHAR, utilizando el estado de las teclas modificadoras (Mayús, Alt, Ctrl) y la distribución del teclado. Ninguno de los cuales puedes controlar, obtendrás el personaje equivocado, al azar.

Simplemente envíe mensajes WM_CHAR, establezca wparam al código de carácter. No hay necesidad de preocuparse por lparam, pocas aplicaciones lo utilizan.

VkKeyScanEx alguien? Según MSDN:

“Traduce un carácter al código de clave virtual correspondiente y al estado de cambio”.

(Es posible que también puedas usar VkKeyScan pero ten en cuenta que ha sido reemplazado por VkKeyScanEx).

Parece que toma el carácter ASCII y lo convierte en hexadecimal. Por ejemplo, ‘A’ en hexadecimal es 41. Según su gráfico, A es 0x41, que es correcto (el hex detonado 0x).

En términos generales, en lugar de enviar mensajes WM_KEYDOWN , WM_CHAR y WM_KEYUP directamente, debe utilizar SendInput (preferido) o posiblemente keybd_event (en desuso).

Puede usar la biblioteca del simulador de entrada que proporciona una api de alto nivel para simular pulsaciones de teclas y manejar todo el contenido de bajo nivel.

System.Windows.Forms.SendKeys es una clase de WinForms con métodos estáticos para simular entradas de teclado en la ventana activa.

El problema es que .NET no tiene manera de enfocar las ventanas en otra aplicación (los documentos de SendKeys hablan sobre cómo solucionarlo).

La solución general es utilizar la función WinAPI de SendMessage . Este enlace describe la firma de SendMessage y proporciona una importación de muestra.

Ah, y para asignar códigos VK, debe usar MapVirtualKey : es mejor asumir que la asignación es arbitraria y no lógica.