2012-11-25 48 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