2010-11-14 6 views
5

Ich mache ein Programm, das die Maus bewegen soll und automatisch an Stellen drücken soll, wo ich im Code angeben. Gerade jetzt habe ich es geschafft, den Cursor zu bewegen, indem Sie diese Zeile: Cursor.Position < - System.Drawing.Point (x, y)Wie simuliert man Mausklicks und Tastendruck in F #

Was habe ich noch nicht herausgefunden, wie ist Mausklicks oder Tastenfolgen zu simulieren . Das einzige, was ich darüber gefunden habe, ist die SendKeys-Klasse von MSDN (http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx). Ich habe versucht, einen Tastendruck mit dieser Klasse zu simulieren, aber ich bekomme eine Laufzeitfehlermeldung.

Die Linie ich benutze, ist: SendKeys.Send („{ENTER}“)

Die Fehlermeldung erhalte ich:. „Tastaturbefehle können nicht in dieser Anwendung ausgeführt werden, da die Anwendung nicht von Windows ist der Umgang mit Nachrichten Entweder ändern die Anwendung zum Behandeln von Nachrichten oder die SendKeys.SendWait-Methode. "

Also habe ich es mit der SendWait-Methode ersetzt, aber es scheint immer noch nicht den Tastendruck zu senden. Wie mache ich das? Was ich wirklich möchte, dass das fertige Programm in der Lage ist zu tun, ist das Senden von Schlüsseln und Mausklicks an ein anderes Programm, das bereits im Hintergrund geöffnet ist. Zum Beispiel, ein Bild in Paint automatisch zu malen.

Antwort

3

Wenn Sie Win32 native Interop vermeiden möchten, ist Windows Input Simulator ein vielversprechender, verwalteter Wrapper um SendInput. Die neueste Version unterstützt jedoch keine Maussimulation. Der aktive Trunk verfügt jedoch über einen Patch zur Unterstützung der Maussimulation (siehe this Diskussion). Das Projekt verwendet VS2010 C#, und Sie können sich selbst aus dem Subversion-Repository here exportieren und erstellen.

Wenn Sie an Win32 native Interop interessiert sind, habe ich eine Demonstration der Verwendung der SendInput API mit F # zusammengestellt. Diese Anwendung simuliert einen Rechtsklick.

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 zweiter Lesung Ihrer Frage, ich sehe, dass letztlich Sie simulieren Maus- und Tastaturereignisse an eine Anwendung im Hintergrund laufen zu senden, wobei in diesem Fall SendMessage/PostMessage entsprechender APIs mehr sein kann. Dies erfordert immer noch native Interop, und hoffentlich hilft mein Beispiel mit SendInput. Here ist eine verwandte Frage.

+0

Ausgezeichnete Spitze für 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) 

Dann zu verwenden:

InteropWithNative.MouseLeftClick() 
Verwandte Themen