2012-01-06 14 views
9

Estoy escribiendo una aplicación (en C#) que como parte de ella debe simular y enviar algunas pulsaciones de teclas a otra aplicación. Estoy usando el proyecto http://inputsimulator.codeplex.com/ para simular claves, y funciona en muchas aplicaciones, pero en algunas no, es decir Mortal Combat 4.¿Cómo simular la entrada del teclado en TODAS las aplicaciones?

He buscado en Google y he encontrado muchas respuestas que varían desde 'es imposible 'a' debe usar XXX library ', etc. Aquellos que respondieron me asustaron mucho, e incluso casi estoy convencido de que no puedo hacerlo en ese momento, PERO ...

M $ Virtual Keyboard funciona. Funciona en TODAS las aplicaciones. Entonces, ES posible ... ¿Alguien de ustedes, hombres inteligentes, saben cómo puedo lograr esto?

+0

¿Qué código tiene hasta ahora que haya intentado ...? – MethodMan

+0

Estoy usando el proyecto que he mencionado anteriormente. El método más bajo es [DllImport ("user32.dll", SetLastError = true)] internal static Extern UInt32 SendInput (UInt32 numberOfInputs, InputMsg [] inputs, Int32 sizeOfInputStructure); y funciona perfectamente en muchas aplicaciones, pero no en todas. :/ –

+4

@FenixVoltres: ingeniería inversa del teclado en pantalla de Windows y utiliza el mismo método de entrada que la biblioteca a la que vinculó ('SendInput'). Enganché todas las funciones relacionadas con el teclado que se me ocurrieron ('keybd_event',' SendInput', 'SetKeyboardState', etc.) y la única función que se llamó fue' SendInput'. Intente verificar dos veces el código de la biblioteca con la documentación de MSDN. –

Respuesta

6

Ok, creo que finalmente tengo que trabajar. Utilicé API Monitor recomendado por Neal P y mostraba las mínimas diferencias entre las llamadas OSK y las mías. Un poco más tarde intenté que mi hilo de llamada durmiera un poco después de enviar mensajes presionando y soltando la tecla, y eso fue todo.

+0

Para cualquier otra persona que intente utilizar API Monitor, solo mostrará el primer elemento de matriz en la matriz INPUT, es decir, si pasa una matriz de 4 elementos a SendItem (por ejemplo, OSK hace esto cuando se cierra para simular la clave LWIN, U keydown , U keyup, LWIN keyup). Para poder ver toda la matriz en la ventana de parámetros edite el archivo User32.xml en el directorio "\ API \ Windows" donde está instalado API Monitor y cambie la línea a Julius

+0

¿Cómo se las arregla para hacer que funcione? Estoy tratando de resolver el mismo problema, pero simplemente poner el hilo a dormir durante un tiempo realmente no resuelve nada. 'InputSimulator.SimulateKeyDown (VirtualKeyCode.VK_0);' ' System.Threading.Thread.Sleep (1000);' ' InputSimulator.SimulateKeyUp (VirtualKeyCode.VK_0);' –

+0

cualquier noticia sobre el comentario de @BogdanMolinger? – Mathias

0

Tome un vistazo a SendKeys en MSDN

+2

lo di un tiro, pero la misma situación que sucede - SendKeys.Send (cadena) funciona, pero no en todas las aplicaciones. Notepad o Explorer lo maneja correctamente, pero no pude hacerlo funcionar en ningún juego de pantalla completa. –

+0

La mayoría de los juegos en línea más nuevos hacen grandes esfuerzos para tratar de frustrar a las personas que escriben programas "bot" por lo que es un poco más difícil que enviar el teclado al Bloc de notas. Todavía se puede pasar por alto algunos de sus esfuerzos mediante el bajo nivel Win32.dll llamadas a la API, pero se abre la puerta a la responsabilidad, por supuesto, dependiendo de dónde viva así que dejo la investigación depende de usted para averiguarlo. – Bueller

+0

Bueno, ¿podría ahorrar una o dos palabras si esos métodos no son los que yo usé? En realidad, este proyecto forma parte de un trabajo más amplio que es mi proyecto final de licenciatura en la Universidad de Ciencia y Tecnología de AGH en Cracovia, Polonia. No quiero romper ninguna ley. : P BTW haciendo un teclado virtual (o un nuevo método de entrada de la computadora en mi caso) es completamente legal, creo? –

0

Aunque fue capaz de lograr su propósito, la forma en que lo logró no responde fundamentalmente a su pregunta: ¿Cómo simular la entrada del teclado en TODAS las aplicaciones?

Hay un montón de situaciones donde el modo de usuario común que ya se mencionó en la API de Microsoft no funciona, como las aplicaciones de juegos que usan la API DirectInput o juegos protegidos.

He creado un library que puede ayudar en estas situaciones, proporciona una API C simple que se comunica internamente con los controladores de filtro del dispositivo. Puede enviar datos de entrada para juegos basados ​​en DirectInput y también puede pasar por alto algunas protecciones del juego. Lo he revisado y todavía es posible evitar algunas protecciones conocidas del juego al usar la versión x64 de la biblioteca. Las protecciones del juego comúnmente solo enganchan la API del sistema x86. Bueno, por fin ahora, 18 de febrero de 2012, esto es lo que estoy viendo sucediendo.

+0

Tiene razón, DirectInput es mi dolor en (_! _). Tuve que dejar de desarrollar mi aplicación por un tiempo, pero definitivamente revisaré tu biblioteca en los próximos días, parece ser algo que estaba buscando. –

+0

@FenixVoltres Además, como actualmente apoyo solo una API C simple, un usuario ha contribuido con un proyecto de C# que P/Invoke lo hace en github, puede consultarlo [aquí] (https://github.com/candera) /kchordr/blob/master/Program.cs) –

Cuestiones relacionadas