2012-05-18 74 views
1

我有一個多線程應用程序,需要能夠同時執行多個鼠標單擊操作。虛擬鼠標單擊c#

我有一個IntPtr intptr我需要發送鼠標點擊的過程。 我試圖在網上找到這些信息,並且有一些我嘗試過的例子。但我沒有得到任何工作。

據我瞭解,以SOLV我的問題,正確的方法是使用功能 SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

的hWnd是的IntPtr的過程。 消息是想要的行動,我想要一個左鍵單擊,int WM_LBUTTONDBLCLK = 0x0203; IntPtr wParam是沒有intrest這個問題(據我所知) 而點擊的座標是在lParam中。 我構建lParam的喜歡,

Int32 word = MakeLParam(x, y); 

private int MakeLParam(int LoWord, int HiWord) 
    { 
     return ((HiWord << 16) | (LoWord & 0xffff)); 
    } 

但是,正如你可能知道,我不能得到這個工作。 我的第一個問題是,座標是否在這個過程的窗口內,或者是絕對座標? 而我的第二個問題,我做錯了什麼?

+0

更多的信息在這裏:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645606(v=vs.85).aspx – mellamokb

+2

這聽起來像是一個問題,有一個更好解決方案比你開始的解決方案...你爲什麼要這樣做? –

回答

0

我不是100%確定我明白你要完成的。但如果你想模擬鼠標輸入,那麼我建議使用SendInput API。

您可以提供一個要插入輸入流的輸入數組。

參見:PInvoke reference

0

我不明白爲什麼有人會想同時發送多個鼠標點擊。如果是測試你的GUI,那是錯誤的測試。沒有人可以在同一時間空間中多次點擊物體。

但回到你的問題,使用SendMessage不會幫助你,因爲它基本上是一個阻塞呼叫。即使您嘗試使用PostMessage,您也無法完成同時點擊,因爲消息隊列正在從UI線程中獲取並彈出消息並按順序處理。

+0

Okey。我覺得我必須澄清一點。我想要的不是多個鼠標點擊相同的IntPtr intptr。我想要的是有多個點擊事件不同的IntPtr intptr。不互相干擾。我的第一次嘗試是移動鼠標指針並進行點擊。當你只有一個進程執行此操作時,這很有效。當多個線程嘗試點擊不同的位置時,它會失敗。 – VbN

0

我用這個代碼,如果你沒有設定手柄打電話來點擊handle

public static void MouseLeftClick(Point p, int handle = 0) 
{ 
    //build coordinates 
    int coordinates = p.X | (p.Y << 16); 
    //send left button down 
    SendMessage(handle, 0x201, 0x1, coordinates); 
    //send left button up 
    SendMessage(handle, 0x202, 0x1, coordinates); 
} 

左鍵 - 然後將其發送點擊桌面,所以座標應該是整個屏幕,如果你設置手柄,那麼消息將被髮送到句柄的窗口,並且您應該爲窗口設置座標。

3

我試圖模擬在C#中的鼠標點擊就在最近,我寫了這個小助手類的伎倆:

public static class SimInput 
{ 
    [DllImport("user32.dll")] 
    static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo); 

    [Flags] 
    public enum MouseEventFlags : uint 
    { 
     Move = 0x0001, 
     LeftDown = 0x0002, 
     LeftUp = 0x0004, 
     RightDown = 0x0008, 
     RightUp = 0x0010, 
     MiddleDown = 0x0020, 
     MiddleUp = 0x0040, 
     Absolute = 0x8000 
    } 

    public static void MouseEvent(MouseEventFlags e, uint x, uint y) 
    { 
     mouse_event((uint)e, x, y, 0, UIntPtr.Zero); 
    } 

    public static void LeftClick(Point p) 
    { 
     LeftClick((double)p.X, (double)p.Y); 
    } 

    public static void LeftClick(double x, double y) 
    { 
     var scr = Screen.PrimaryScreen.Bounds; 
     MouseEvent(MouseEventFlags.LeftDown | MouseEventFlags.LeftUp | MouseEventFlags.Move | MouseEventFlags.Absolute, 
      (uint)Math.Round(x/scr.Width * 65535), 
      (uint)Math.Round(y/scr.Height * 65535)); 
    } 

    public static void LeftClick(int x, int y) 
    { 
     LeftClick((double)x, (double)y); 
    } 
} 

的座標是65535分,這是一個有點古怪,但這種班級會爲你處理。

+0

如果您是在「最近」這樣做的,爲什麼使用過時的['mouse_event'函數](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms646260.aspx)而不是推薦['SendInput'函數](http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx)? –

+1

@CodyGray:我無法讓SendInput工作。這OTOH完美運作。如果您有一個使用SendInput的C#示例,以像素爲單位在屏幕座標中發送鼠標點擊...我希望看到它。 – mpen