2009-03-15 47 views
21

Để bắt đầu tôi thấy mã này ở http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html:Di chuyển con trỏ chuột theo chương trình

public class Win32 
{ 
    [DllImport("User32.Dll")] 
    public static extern long SetCursorPos(int x, int y); 

    [DllImport("User32.Dll")] 
    public static extern bool ClientToScreen(IntPtr hWnd, ref POINT point); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct POINT 
    { 
     public int x; 
     public int y; 
    } 
} 

Dán đoạn mã sau vào những nút eventhandler nhấp chuột:

Win32.POINT p = new Win32.POINT(); 
p.x = button1.Left + (button1.Width/2); 
p.y = button1.Top + (button1.Height/2); 

Win32.ClientToScreen(this.Handle, ref p); 
Win32.SetCursorPos(p.x, p.y); 

này sẽ di chuyển con trỏ chuột đến trung tâm của nút.

Mã này hoạt động rất tốt, nhưng tôi dường như không thể tìm ra cách mở rộng nó một chút. Hãy nói rằng tôi có internet explorer (nhúng trong một hình thức cửa sổ) mở một trang web (một số trang ngẫu nhiên tôi không biết về trước khi tay) với một hộp danh sách thả xuống trong đó. Tôi đã sửa đổi mã trên để di chuyển con trỏ qua và nhận hộp danh sách thả xuống (bằng cách sử dụng phương pháp nhấp chuột được hiển thị bên dưới để thả danh sách xuống), và cũng di chuyển lên và xuống danh sách làm nổi bật từng mục như con trỏ chuột đi qua, nhưng đối với cuộc sống của tôi tôi không thể tìm ra cách để thực sự làm cho click chuột vào mục hiện đang được chọn để giữ cho lựa chọn. Cách tôi đang làm nó bây giờ hộp danh sách thả xuống chỉ đóng và lựa chọn không thay đổi. Tôi đang sử dụng đoạn mã sau cho click chuột (mà không có được danh sách để thả xuống):

private static void MouseClick(int x, int y, IntPtr handle) //handle for the browser window 
{ 
    IntPtr lParam = (IntPtr)((y << 16) | x); // The coordinates 
    IntPtr wParam = IntPtr.Zero; // Additional parameters for the click (e.g. Ctrl) 

    const uint downCode = 0x201; // Left click down code 
    const uint upCode = 0x202; // Left click up code 

    SendMessage(handle, downCode, wParam, lParam); // Mouse button down 
    SendMessage(handle, upCode, wParam, lParam); // Mouse button up 
} 

Tôi chắc rằng tôi đang thiếu một cái gì đó đơn giản ở đây, nhưng đối với cuộc sống của tôi không thể tìm ra nó là gì Cảm ơn trước tất cả mọi người.

Bob

Trả lời

16

Bạn nên sử dụng SendInput (http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx) để tổng hợp các sự kiện click chuột thay vì sử dụng SendMessages trực tiếp.

+0

SendInput cố định vấn đề này và rất nhiều người khác tôi gặp phải. Cảm ơn vì đã giúp tôi giải quyết vấn đề này. Bob – Beaker

+0

Tuyệt vời! Cảm ơn :) Tôi đã sắp hỏi cùng một câu hỏi. – hasen

+0

@michael Tôi muốn xử lý cuộn và cuộn các sự kiện, làm cách nào để thực hiện điều đó? – Faizan

3

Tôi tin rằng bạn đang bỏ lỡ một đúng WPARAM cho WM_LBUTTONDOWN tin nhắn, mà cho các nút trái là MK_LBUTTON

#define MK_LBUTTON   0x0001 
Các vấn đề liên quan