2010-11-14 12 views
5

Estoy haciendo un programa que se supone que mueve el mouse y lo presiono automáticamente en los lugares donde especifico en el código. En este momento me las he arreglado para mover el cursor mediante el uso de esta línea: Cursor.Position < - System.Drawing.Point (x, y)Cómo simular clics del mouse y presionar teclas en F #

Lo que no he descubierto aún es cómo simular pulsaciones de teclas o clics del mouse . Lo único que encontré sobre esto es la clase SendKeys de MSDN (http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx). Traté de simular una pulsación de tecla con esta clase, pero aparece un mensaje de error en tiempo de ejecución.

La línea que uso es: SendKeys.Send ("{ENTER}")

El mensaje de error que consigo:. "SendKeys no se pueden ejecutar dentro de esta aplicación, ya que la aplicación no está manejando los mensajes de Windows cambiar cualquiera la aplicación para manejar mensajes, o usa el método SendKeys.SendWait ".

Así que lo reemplacé con el método SendWait, pero todavía no parece enviar la pulsación de tecla. ¿Cómo hago esto? Lo que realmente quiero que el programa terminado sea capaz de hacer, es enviar claves y clics del mouse a otro programa que ya está abierto en segundo plano. Por ejemplo, pintar una imagen en Paint automáticamente.

Respuesta

3

Si desea evitar la interoperabilidad nativa de Win32, Windows Input Simulator es una envoltura administrada de aspecto prometedor alrededor de SendInput. Pero la última versión no admite la simulación de mouse. Sin embargo, el tronco activo tiene un parche para apoyar la simulación de ratón (consulte this discusión). El proyecto está utilizando VS2010 C#, y puede exportar y compilarse desde el repositorio de subversión here.

Si está interesado en la interoperabilidad nativa Win32, armé una demostración de cómo usar la API SendInput con F #. Esta aplicación simula un clic derecho.

open System 
open System.Runtime.InteropServices 

type MOUSEINPUT = struct 
    val dx:int 
    val dy:int 
    val mouseData:int 
    val dwFlags:int 
    val time:int 
    val dwExtraInfo:int 
    new(_dx, _dy, _mouseData, _dwFlags, _time, _dwExtraInfo) = {dx=_dx; dy=_dy; mouseData=_mouseData; dwFlags=_dwFlags; time=_time; dwExtraInfo=_dwExtraInfo} 
end 

type INPUT = struct 
    //need to escape traditional INPUT identifier here since "type" is a reserved word 
    //though could use any other identifier name if so desired 
    val ``type``:int //0 is mouse 
    val mi:MOUSEINPUT 
    new(_type, _mi) = {``type``=_type; mi=_mi} 
end 

let MOUSEEVENTF_RIGHTDOWN = 0x0008 
let MOUSEEVENTF_RIGHTUP = 0x0010 

[<DllImport("user32.dll", SetLastError=true)>] 
extern uint32 SendInput(uint32 nInputs, INPUT* pInputs, int cbSize) 

let mutable inputRightDown = INPUT(0, MOUSEINPUT(0, 0, 0, MOUSEEVENTF_RIGHTDOWN, 0, 0)) 
let mutable inputRightUp = INPUT(0, MOUSEINPUT(0, 0, 0, MOUSEEVENTF_RIGHTUP, 0, 0)) 

SendInput(uint32 1, &&inputRightDown, Marshal.SizeOf(inputRightDown)) 
SendInput(uint32 1, &&inputRightUp, Marshal.SizeOf(inputRightUp)) 

En la segunda lectura de su pregunta, veo que en última instancia que desea enviar eventos simulados ratón y el teclado a una aplicación que se ejecuta en segundo plano, en cuyo caso SendMessage/PostMessage puede haber API más apropiadas. Esto aún requerirá interoperabilidad nativa, y con suerte mi ejemplo con SendInput ayudará. Here es una pregunta relacionada.

+0

Excelente consejo para InputSimulator !! +1 –

0
open System.Runtime.InteropServices 

module InteropWithNative = 
    [<DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)>] 
    extern void mouse_event(System.Int64, System.Int64, System.Int64, System.Int64, System.Int64) 

    let MOUSEEVENTF_LEFTDOWN = 0x02L 
    let MOUSEEVENTF_LEFTUP  = 0x04L 
    let MOUSEEVENTF_RIGHTDOWN = 0x08L 
    let MOUSEEVENTF_RIGHTUP  = 0x10L 

    let MouseLeftClick() = 
     mouse_event(MOUSEEVENTF_LEFTDOWN, 0L, 0L, 0L, 0L) 
     mouse_event(MOUSEEVENTF_LEFTUP, 0L, 0L, 0L, 0L) 

Luego de usar:

InteropWithNative.MouseLeftClick() 
Cuestiones relacionadas