2010-11-14 16 views
5

Fareyi hareket ettirecek ve kodda belirttiğim yerlerde otomatik olarak basacak bir program yapıyorum. Şu anda ben bu hattı kullanarak imleci hareket ettirmek için idare ettik: Cursor.Position < - System.Drawing.Point (x, y)Fare tıklamaları ve tuşa basma işlemleri nasıl yapılır? F #

henüz öğrendim mouseclicks veya basılmasını taklit etmek nasıl değil ne . Bu konuda bulduğum tek şey MSDN'den SendKeys Sınıfıdır (http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx). Bu sınıfla bir tuşa basmayı denedim, ancak bir çalışma zamanı hatası iletisi alıyorum.

kullandığım çizgidir: SendKeys.Send ("{ENTER}")

alıyorum hata mesajı:. Uygulama, Windows iletilerini işleyen değil çünkü "SendKeys bu uygulama içinde koşamam Ya değişim Mesajları işlemek veya SendKeys.SendWait yöntemini kullanın. "

Bu yüzden onu SendWait yöntemiyle değiştirdim, ancak yine de bu tuşa basma gibi görünmüyor. Bunu nasıl yaparım? Bitmiş programın gerçekten yapmasını istediğim şey, arka planda zaten açık olan başka bir programa anahtarlar ve fare tıklamaları gönderiyor. Örneğin, bir resmi otomatik olarak Paint'te boyamak.

cevap

3

Win32 yerel birlikte çalışmasını önlemek istiyorsanız, Windows Input Simulator, SendInput civarında umut verici bir görünümde yönetilen sarıcıdır. Ancak en son sürüm fare simülasyonunu desteklemiyor. Bununla birlikte, aktif bagajın fare simülasyonunu desteklemek için bir yaması vardır (bakınız this tartışması). Proje, VS2010 C# kullanıyor ve subversion deposu here'dan kendiniz ihracat yapabiliyorsunuz.

Win32 yerel birlikte çalışma ile ilgileniyorsanız, SendInput API'sini F # ile nasıl kullanacağınızı gösteren bir tanıtım hazırladık. Bu uygulama sağ tıklama simüle eder. Sorunuzun ikinci okumada günü

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

, ben sonuçta SendMessage/ PostMessage daha uygun API'leri olabilir ki bu durumda arka planda çalışan bir uygulama, simüle fare ve klavye olayları göndermek istediğiniz görüyoruz. Bu hala yerel bir arada çalışma gerektirecek ve umarım benim SendInput kullanarak benim örneğim yardımcı olacaktır. Here ilgili bir sorudur.

+0

Mükemmel ucu !! +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) 

Ardından kullanmak: InputSimulator için

InteropWithNative.MouseLeftClick() 
İlgili konular