2011-12-31 10 views
6

Estoy trabajando en mi propio software para operar el mouse en mi computadora usando C# y el kinect SDK. Realmente quiero intentar usarlo para jugar un juego como Red Alert, o algún tipo de RTS, o incluso solo para navegación general.Emulación de mouse en un programa diferente

El problema que he encontrado es que al usar un programa con un mouse diferente, como alerta roja o ir a una máquina virtual donde la integración del mouse no es compatible, el programa no contestará las llamadas que El programa C# está haciendo las llamadas System.Windows.Forms.Cursor, y mucho menos las llamadas mouse_event. Soy nuevo en la interfaz con Windows y lo que está sucediendo aquí, ¿alguien puede explicar/plantear una solución?

--UPDATE-- Como una actualización, todavía no estoy del todo seguro de lo que está sucediendo, pero parece haber encontrado una solución para la alerta roja en particular;

Como la alerta roja es un programa de gráficos bastante bajo, es trivial ejecutarlo en una máquina virtual específicamente para mí, estación de trabajo vmware con un cliente XP. Si usas el código mouse_event funciona bien, SIN EMBARGO, algo con lo que tuve problemas fue encontrar el código correcto para representar el movimiento del mouse. Parecería que la bandera MOVE mueve el mouse relativamente, lo que no quería, y la etiqueta absoluta no movió el mouse en absoluto. Es, de hecho, la de los que tienen produce movimiento absoluto en la pantalla, por lo que mi código para el movimiento del ratón y emulación clic terminó con este aspecto:

mouse_event((int)0x00000002, cursor.X, cursor.Y, 0, 0); 

para hacer clic y

mouse_event((int)(0x00000001 | 0x00008000), x, y, 0 0); 

para el movimiento del mouse, donde xey son las nuevas coordenadas de 65535 (el rango absoluto). ¿Es perfecto? Nah. Pero funciona por ahora. Creo que hay algo que ver con la forma en que Windows ignora ciertos programas cuando se ejecuta ra, ¿tal vez por el modo de compatibilidad? No tengo otro juego para probarlo en este momento, pero publicaré resultados con un modo no compatible en el futuro.

  • Pete

(Sería no me deja publicar como una respuesta dentro de dos horas y tengo que dormir para tomar un vuelo por la mañana!)

+0

Recomiendo usar la función 'SendInput' sobre la función obsoleta' mouse_event'. –

Respuesta

1

Tendrá que hacer algunos mensajes de Windows de bajo nivel para que esto funcione correctamente. Los juegos que usan DirectX como Red Alert no verán System.Windows.Forms.Cursor en absoluto. Tendrá que interactuar con Windows User32.dll para enviar los mensajes apropiados a Windows para que pueda enrutarlos apropiadamente a las otras aplicaciones.

Aquí hay un código para que pueda empezar buscando la función de enviar mensajes a través del User32 DLL en C#:

[DllImport("USER32.DLL")] 
    public static extern IntPtr FindWindow(string lpClassName, 
     string lpWindowName); 

    // Activate an application window. 
    [DllImport("USER32.DLL")] 
    public static extern bool SetForegroundWindow(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

espero que esto le ayudará a comenzar, pero no tengo el tiempo para ir a través de cada mensaje del mouse, qué son wParam y lParam, y cuál debe ser el Msg para cada uno. Estoy seguro de que si busca alrededor puede encontrar los mensajes específicos para enviar para cada evento, como mover el mouse, hacer clic izquierdo y hacer clic con el botón derecho.

Buena suerte.

+1

En realidad, un juego que use DirectX tampoco usará GetMessage(), por lo que SendMessage() probablemente no tenga ningún efecto. Necesitas cosas de nivel inferior. El material de nivel más bajo que conozco es mouse_event(). –

+0

Ahora mismo tengo algo un poco hacky que funciona a medias. Estoy usando un mouse_event() para hacer clic en el mouse de todos modos y también estoy tratando de usar SetCursorPos() para mover el mouse. Tal vez me falta un redibujado o algo así? Pero cuando se llama mouse_event funciona correctamente y vuelve a dibujar el mouse donde debería (y hace clic), pero SetCursorPos() no lo hace. Código actual: '[DllImport ("user32.dll", EntryPoint = "SetCursorPos")] [para volver : MarshalAs (UnmanagedType.Bool)] SetCursorPos extern bool estáticas privadas (int x, int y);' –

+0

También debo mencionar que mouse_events() no parece funcionar en absoluto en la máquina normal, la única forma en que incluso he recibido alguna respuesta de mouse_event es intentar ejecutarlo en una máquina virtual (pensé que tal vez si obtenía toda la entrada que se ejecuta a través de lo que el pensamiento virtual fue una fuente que podría funcionar). –

Cuestiones relacionadas