c ++ - Hvordan kan jeg simulere et dobbelt museklik på vinduet (jeg kan håndtere) på x, y-koordinat, ved hjælp af SendInput?

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan kan jeg simulere et dobbelt museklik på vinduet (jeg kan håndtere dette vindue) på x, y-koordinat, ved hjælp af SendInput?

Bedste reference


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));
}


Du kan bruge GetWindowRect () til at få vinduets position fra håndtaget og passere relative x og y til DoubleClick-funktionen:


RECT rect;
GetWindowRect(hwnd, &rect);

HWND phwnd = GetForegroundWindow();

SetForegroundWindow(hwnd);

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

SetForegroundWindow(phwnd); // To activate previous window

Andre referencer 1


Dette vil simulere et dobbeltklik på bestemte koordinater


  SetCursorPos(X,Y);
  mouse\_event(MOUSEEVENTF\_LEFTDOWN | MOUSEEVENTF\_LEFTUP,0,0,0,0);
  mouse\_event(MOUSEEVENTF\_LEFTDOWN | MOUSEEVENTF\_LEFTUP,0,0,0,0);

Andre referencer 2


Du kan angive dit mål (bedst) eller metoden, men hvis du forsøger at angive begge, vil svaret være 'det virker ikke sådan'.


SendInput virker ikke sådan, det simulerer musaktivitet på skærmen, som vil blive leveret til det vindue, der er synligt på den pågældende placering (eller har musepåvirkning), ikke vinduet efter eget valg.


For at levere et dobbeltklik på et bestemt vindue, prøv PostMessage(hwnd, WM\_LBUTTONDBLCLK, 0, MAKEDWORD(x, y)). [10]

Andre referencer 3


Der er et stykke kode på denne hjemmeside. Prøv at bruge funktionen LeftClick() to gange i træk. Det gør tricket ifølge denne fyr. [11] [12]

Andre referencer 4


Da jeg ikke har det nok (') omdømme', vil jeg gerne kommentere #fardjads løsning: det virker godt, men man kan tilføje følgende til 'main' rutinen:


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);