2010-11-14 11 views
5

Sto facendo un programma che dovrebbe spostare il mouse e premere automaticamente nei punti in cui specifico nel codice. In questo momento sono riuscito a spostare il cursore con questa linea: Cursor.Position < - System.Drawing.Point (x, y)Come simulare i clic del mouse e la pressione dei tasti in F #

Quello che non ho trovato fuori ancora è come simulare clic del mouse o pressione dei tasti . L'unica cosa che ho trovato su questo è la classe SendKeys da MSDN (http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx). Ho provato a simulare un keypress con questa classe, ma ricevo un messaggio di errore in fase di esecuzione.

La linea che uso è: SendKeys.Send ("{ENTER}") Il messaggio di errore ottengo

:. "SendKeys non possono eseguire all'interno di questa applicazione perché l'applicazione non gestisce i messaggi di Windows cambiamento entrambi i casi l'applicazione per gestire i messaggi o utilizzare il metodo SendKeys.SendWait. "

Quindi l'ho sostituito con il metodo SendWait, ma ancora non sembra inviare il tasto. Come faccio a fare questo? Quello che voglio davvero che il programma finito sia in grado di fare, è l'invio di chiavi e clic del mouse su un altro programma che è già aperto in background. Ad esempio, dipingendo un'immagine in Paint automaticamente.

risposta

3

Se si desidera evitare l'interoperabilità nativa di Win32, Windows Input Simulator è un involucro gestito dall'aspetto promettente intorno a SendInput. Ma l'ultima versione non supporta la simulazione del mouse. Tuttavia, il trunk attivo dispone di una patch per supportare la simulazione del mouse (vedere la discussione this). Il progetto utilizza VS2010 C# ed è possibile esportare e creare autonomamente dal repository di subversion here.

Se si è interessati all'interop nativo di Win32, ho messo insieme una dimostrazione di come utilizzare l'API SendInput con F #. Questa applicazione simula un clic destro.

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)) 

in seconda lettura della tua domanda, vedo che alla fine si desidera inviare gli eventi simulati di mouse e tastiera a un'applicazione in esecuzione in background, nel qual caso SendMessage/PostMessage API possono essere più appropriato. Ciò richiederà ancora l'interoperabilità nativa, e si spera che il mio esempio con SendInput possa essere d'aiuto. Here è una domanda correlata.

+0

eccellente suggerimento per 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) 

quindi di utilizzare:

InteropWithNative.MouseLeftClick() 
Problemi correlati