2012-11-25 45 views
0

Click不工作 - 我不知道爲什麼,不能找到一個解決辦法:(點擊指定的客戶端區域

Click(150,215)應該移動鼠標到客戶端區域,然後單擊有

[DllImport("user32.dll")] 
    private static extern bool ScreenToClient(IntPtr hWnd, ref Point lpPoint); 

    [DllImport("user32", SetLastError = true)] 
    private static extern int SetCursorPos(int x, int y); 

    static void MouseMove(int x, int y) 
    { 
     Point p = new Point(x * -1, y * -1); 
     ScreenToClient(hWnd, ref p); 
     p = new Point(p.X * -1, p.Y * -1); 
     SetCursorPos(p.X, p.Y); 
    } 

    static void Click(int x, int y) 
    { 
     MouseMove(x, y); 
     SendMessage(hWnd, WM_LBUTTONDOWN, (IntPtr)0x1, new IntPtr(y * 0x10000 + x)); 
     SendMessage(hWnd, WM_LBUTTONUP, (IntPtr)0x1, new IntPtr(y * 0x10000 + x)); 
    } 

編輯: 以下方法工作,但 「更先進」 我會說

我當然可以使用mouse_event對於這一點,但我想看到的SendMessage()的解決方案......

[DllImport("user32.dll")] 
    static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); 

    const int LEFTDOWN = 0x00000002; 
    const int LEFTUP = 0x00000004; 

    static void Click(int x, int y) 
    { 
     MouseMove(x, y); 
     mouse_event((int)(LEFTDOWN), 0, 0, 0, 0); 
     mouse_event((int)(LEFTUP), 0, 0, 0, 0); 
    } 

過了一會兒,我發現MouseInput另一種方法通過SendInput,但它是很長的: P

它可以縮小?

 [Flags] 
    enum MouseEventFlags : uint 
    { 
     MOUSEEVENTF_MOVE = 0x0001, 
     MOUSEEVENTF_LEFTDOWN = 0x0002, 
     MOUSEEVENTF_LEFTUP = 0x0004, 
     MOUSEEVENTF_RIGHTDOWN = 0x0008, 
     MOUSEEVENTF_RIGHTUP = 0x0010, 
     MOUSEEVENTF_MIDDLEDOWN = 0x0020, 
     MOUSEEVENTF_MIDDLEUP = 0x0040, 
     MOUSEEVENTF_XDOWN = 0x0080, 
     MOUSEEVENTF_XUP = 0x0100, 
     MOUSEEVENTF_WHEEL = 0x0800, 
     MOUSEEVENTF_VIRTUALDESK = 0x4000, 
     MOUSEEVENTF_ABSOLUTE = 0x8000 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); 

    [StructLayout(LayoutKind.Explicit)] 
    struct MouseKeybdhardwareInputUnion 
    { 
     [FieldOffset(0)] 
     public MouseInputData mi; 
    } 
    struct MouseInputData 
    { 
     public int dx; 
     public int dy; 
     public uint mouseData; 
     public MouseEventFlags dwFlags; 
     public uint time; 
     public IntPtr dwExtraInfo; 
    } 
    [StructLayout(LayoutKind.Sequential)] 
    struct INPUT 
    { 
     public SendInputEventType type; 
     public MouseKeybdhardwareInputUnion mkhi; 
    } 
    enum SendInputEventType : int 
    { 
     InputMouse, 
    } 

    static void Click(int x, int y) 
    { 
     INPUT mouseInput = new INPUT(); 
     mouseInput.type = SendInputEventType.InputMouse; 
     mouseInput.mkhi.mi.dx = x; 
     mouseInput.mkhi.mi.dy = y; 
     mouseInput.mkhi.mi.mouseData = 0; 

     MouseMove(x, y); 
     mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN; 
     SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT())); 

     mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP; 
     SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT())); 
    } 

回答

1

雖然我沒有調查你們描述完全相同的問題,我建議你看一看mouse_eventSendInput其目的是爲了做你的描述Windows API調用。

mouse_event是呼叫的較早版本,SendInput較新,並且通過支持多個輸入事件取代mouse_input。這兩種方法都可以用P/Invoke.net在下列網址:

+0

謝謝,我已經有mouse_event方法。你覺得'SendInput'比簡單的'SendMessage'更好嗎(性能,速度)? – VixinG

+0

看看我的編輯請告訴我,如果它可以以某種方式收縮:) – VixinG

+0

發送'WM_LBUTTONDOWN'到任何你不擁有的窗口看起來像它會容易出錯。我找不到任何實際的文檔建議以這種方式使用'WM_LBUTTONDOWN',並且我確實知道'mouse_event'和'SendInput'是支持的方式。如果您擔心此類電話的表現,則必須對其進行基準測試。雖然'SendInput'是詳細的,大部分是P/Invoke簽名。 – Mitch