Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Manu343726 en 27 de Octubre de 2012, 04:03:05 PM

Título: teclado virtual en windows
Publicado por: Manu343726 en 27 de Octubre de 2012, 04:03:05 PM
buenas

estoy desarrollando una aplicación de comandos de voz para ejecutar atajos de teclado. Algo tipo "lanzar granada" y que pulse la tecla G

Tras hechar un vistazo a la documentación de la API de windows, lo unico que he encontrado es "SetKeyboardState" pero dice que solo afecta al hilo llamante. Alguna idea?

PD: Mientras escribia ésto, me he acordado de SendMessage. Podria mandar un mensaje de pulsacion de tecla, pero no afecta solo a la ventana/aplicación del manejador que le paso?

Mi problema es que dicho mensaje deberia llegar a la ventana que tiene el foco (El juego, en el caso del ejemplo)
Título: Re: teclado virtual en windows
Publicado por: Manu343726 en 28 de Octubre de 2012, 11:40:29 AM
Tras fisgar un poco más estoy barajando utilizar PostMessage (Obteniento el HWND de GetForegroundWindow) o utilizar SendInput para simular interrupciones hardware. 
La única pega que veo es que con ninguno de los dos veo la forma "directa" de mandar pulsaciones de tecla que incluyan control o shift (algo tipo CTRL + A). Solo se me ocurre mandar un keydown del shift, luego el keydown de la A, y luego los keyup del shift y de la A.

Alguna idea?

Título: Re: teclado virtual en windows
Publicado por: Manu343726 en 28 de Octubre de 2012, 12:19:04 PM
Al final me ha podido la vaguería, ando con algo de prisa, y voy a tirar de un wrapper que he encontrado en CodePlex que utiliza SendInput. La verdad es que tiene muy buena pinta: http://inputsimulator.codeplex.com/
Título: Re: teclado virtual en windows
Publicado por: Manu343726 en 28 de Octubre de 2012, 09:55:40 PM
Ahora intentaré hacer una pregunta que no pueda autoresponder en menos de doce horas:

Como comenté en el post anterior, al final he utilizado un wrapper de SendInput llamado "Input Simulator" (http://inputsimulator.codeplex.com/)
con el que he conseguido hacer funcionar mi cacharro:
(http://img38.imageshack.us/img38/8136/kinectstick2.png) (http://imageshack.us/photo/my-images/38/kinectstick2.png/)

Pero hay un problema: En el escritorio funciona perfectamente, como veis lo he estado probando con el bloc de notas. Pero lo he probado con juegos y no funciona.
No se supone que SendInput emula interrupciones hardware? De ser así, no debería haber diferencia entre usar funciones del API de windows para captar las pulsaciones de tecla (Véase WM_KEYDOWN) o utilizar DirectInput o cualquier otro sistema. Digo yo.

Se supone que SendInput no lanza eventos a nivel del hilo llamante, debería lanzarlos a nivel global. Si ésto es así, y yo no he entendido mal, no debería haber problema. Alguna idea?

Puede ser también que el sistema de reconocimiento de voz necesite tener el foco para funcionar (Como si de cualquier otro tipo de input se tratara)?