2012-01-05 32 views
9

Tôi đã thử [DllImport ("user32.dll")] static extern bool SetCursorPos (int X, int Y);Chỉ đạo sự kiện chuột [DllImport ("user32.dll")] nhấp, nhấp đúp vào

và hoạt động khá tốt để di chuyển con trỏ đến điểm mong muốn. Tôi chưa bao giờ thử loại nhập DLL như vậy trước đây nhưng nó hoạt động :). Tuy nhiên tôi muốn nhiều hơn những gì khác tôi có thể trích xuất? Chủ yếu là tôi muốn thực hiện nhấp đúp, nhấp hoặc sử dụng các tùy chọn bánh xe mà không có bất kỳ đầu vào chuột nào, chỉ cần mã làm cách nào tôi có thể làm điều đó? và làm thế nào tôi có thể kiểm tra những gì khác được bao gồm trong user32dll?

Thanx

+0

Một chủ đề bạn có thể quan tâm là [UI Automation trong .NET] (http://msdn.microsoft.com/en -us/library/ms753326 (v = vs.110) .aspx). - Ngoài ra, hãy ghi nhớ, các vị trí X & Y đó nằm trong tọa độ màn hình vật lý (chỉ giống như logic cho 96 DPI - nhưng đối với các DPI khác thì không - hầu hết .NET Framework đều sử dụng tọa độ logic cho tất cả). – BrainSlugs83

Trả lời

12
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, UIntPtr dwExtraInfo); 
private const uint MOUSEEVENTF_LEFTDOWN = 0x02; 
private const uint MOUSEEVENTF_LEFTUP = 0x04; 
private const uint MOUSEEVENTF_RIGHTDOWN = 0x08; 
private const uint MOUSEEVENTF_RIGHTUP = 0x10; 

Bạn nên nhập khẩu và Xác định các hằng số để làm việc với Chuột sử dụng Win32API

Sử dụng phương pháp là dưới đây để làm Chuột hoạt động của

void sendMouseRightclick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseDoubleClick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0); 

Thread.Sleep(150); 

    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseRightDoubleClick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 

    Thread.Sleep(150); 

    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseDown() 
{ 
    mouse_event(MOUSEEVENTF_LEFTDOWN, 50, 50, 0, 0); 
} 

void sendMouseUp() 
{ 
    mouse_event(MOUSEEVENTF_LEFTUP, 50, 50, 0, 0); 
} 

Nếu bạn muốn làm một Kéo chuột bạn nên đầu tiên Gửi MouseDown (Mouse Click) và giữ nó Clicked trong khi thay đổi vị trí chuột hơn Gửi MouseUp (Release Click) một cái gì đó như thế này.

sendMouseDown(); 
Cursor.Position = new Point(30,30); 
sendMouseUp(); 
+2

Thông tin bổ sung: Cuộc gọi đến chức năng PInvoke 'KinectHandTracking! KinectHandTracking.MainWindow :: mouse_event' đã không cân bằng chồng. Điều này có thể do chữ ký PInvoke được quản lý không khớp với chữ ký đích không được quản lý. Kiểm tra rằng quy ước và tham số gọi của chữ ký PInvoke khớp với chữ ký không được quản lý đích. – albatross

+1

theo cách dài nên uint nếu không nó sẽ cho một ngoại lệ. – albatross

+1

FYI, bạn không nên trộn 'Cursor.Position' (hoạt động trong tọa độ logic) với' User32''s 'SetCursorPos' (hoạt động trong các tọa độ vật lý). Dưới đây là bài viết MSDN về Chia tỷ lệ màn hình và Tự động hóa giao diện người dùng: http://msdn.microsoft.com/en-us/library/aa970067(v=vs.110).aspx – BrainSlugs83

3

Hãy xem pinvoke.net để xem danh sách các API khả dụng. Các ví dụ mã và các câu lệnh nhập được bao gồm. Bạn cũng có thể mở rộng vùng chọn bên trái để xem các API có sẵn cho mỗi DLL.

4

Sử dụng loại dài làm tăng lỗi "PInvoke".

Chúng ta nên sử dụng int loại:

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

[Flags] 
public enum MouseEventFlags 
{ 
    LEFTDOWN = 0x00000002, 
    LEFTUP = 0x00000004, 
    MIDDLEDOWN = 0x00000020, 
    MIDDLEUP = 0x00000040, 
    MOVE = 0x00000001, 
    ABSOLUTE = 0x00008000, 
    RIGHTDOWN = 0x00000008, 
    RIGHTUP = 0x00000010 
} 

public static void LeftClick(int x, int y) 
{ 
    Cursor.Position = new System.Drawing.Point(x, y); 
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); 
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0); 
} 

nguồn: http://www.pinvoke.net/default.aspx/user32.mouse_event