2011-04-26 13 views

Trả lời

14
void DoubleClick(int x, int y) 
{ 
    const double XSCALEFACTOR = 65535/(GetSystemMetrics(SM_CXSCREEN) - 1); 
    const double YSCALEFACTOR = 65535/(GetSystemMetrics(SM_CYSCREEN) - 1); 

    POINT cursorPos; 
    GetCursorPos(&cursorPos); 

    double cx = cursorPos.x * XSCALEFACTOR; 
    double cy = cursorPos.y * YSCALEFACTOR; 

    double nx = x * XSCALEFACTOR; 
    double ny = y * YSCALEFACTOR; 

    INPUT Input={0}; 
    Input.type = INPUT_MOUSE; 

    Input.mi.dx = (LONG)nx; 
    Input.mi.dy = (LONG)ny; 

    Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; 

    SendInput(1,&Input,sizeof(INPUT)); 
    SendInput(1,&Input,sizeof(INPUT)); 

    Input.mi.dx = (LONG)cx; 
    Input.mi.dy = (LONG)cy; 

    Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; 

    SendInput(1,&Input,sizeof(INPUT)); 
} 

Bạn có thể sử dụng GetWindowRect() để có được những vị trí cửa sổ từ xử lý của nó và vượt qua tương đối xy chức năng DoubleClick:

RECT rect; 
GetWindowRect(hwnd, &rect); 

HWND phwnd = GetForegroundWindow(); 

SetForegroundWindow(hwnd); 

DoubleClick(rect.left + x, rect.top + y); 

SetForegroundWindow(phwnd); // To activate previous window 
1

Có một đoạn mã trong this website. Thử sử dụng hàm LeftClick() hai lần liên tiếp. Điều đó thực hiện lừa theo this guy.

2

Bạn có thể chỉ định mục tiêu của bạn (tốt nhất) hoặc phương pháp, nhưng nếu bạn cố gắng chỉ định cả hai, thường thì không phải câu trả lời sẽ "không hoạt động như thế".

SendInput không hoạt động như vậy, nó mô phỏng hoạt động chuột trên màn hình, sẽ được gửi tới cửa sổ bất kỳ ở vị trí đó (hoặc có chụp chuột), không phải cửa sổ bạn chọn.

Để phân phối nhấp đúp vào một cửa sổ cụ thể, hãy thử PostMessage(hwnd, WM_LBUTTONDBLCLK, 0, MAKEDWORD(x, y)).

4

này sẽ mô phỏng một nhấp đúp chuột vào một số tọa độ

SetCursorPos(X,Y); 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0); 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0); 
0

Từ 'uy tín' của tôi không đủ cao (chưa), tôi muốn nhận xét về giải pháp # fardjad của: nó hoạt động tuyệt vời, nhưng một có thể thêm sau đây vào thói quen "chính":

SetForegroundWindow(hwnd); 
SetCursorPos(rect.left + x, rect.top + y); 
// which shows your current mouseposition... 
// during my testing, I used a _getch() so that I actually could verify it 
Sleep(nWinSleep); 
// delay the mouseclick, as window might not get to foreground quick enough; 
    took me awhile to figure this one out... 
DoubleClick(rect.left + x, rect.top + y); 
Các vấn đề liên quan