Как я могу имитировать двойной щелчок мыши по окну (я khow handle) по координатам x, y, используя SendInput? - PullRequest
9 голосов
/ 26 апреля 2011

Как я могу имитировать двойной щелчок мышью по окну (я знаю дескриптор этого окна) по координатам x, y, используя SendInput?

Ответы [ 5 ]

15 голосов
/ 26 апреля 2011
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));
}

Вы можете использовать GetWindowRect (), чтобы получить положение окна из его дескриптора и передать относительные x и y в функцию DoubleClick:

RECT rect;
GetWindowRect(hwnd, &rect);

HWND phwnd = GetForegroundWindow();

SetForegroundWindow(hwnd);

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

SetForegroundWindow(phwnd); // To activate previous window
4 голосов
/ 07 сентября 2013

Имитируется двойной щелчок в определенных координатах

  SetCursorPos(X,Y);
  mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0);
  mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0);
2 голосов
/ 26 апреля 2011

Вы можете указать свою цель (лучшую) или метод, но если вы попытаетесь указать оба, чаще всего ответ будет "это не работает".

SendInput не работает так, он имитирует активность мыши на экране, которая будет доставлена ​​в любое окно, видимое в этом месте (или с захватом мыши), а не в окно по вашему выбору.

Комудоставить двойной щелчок в определенное окно, попробуйте PostMessage(hwnd, WM_LBUTTONDBLCLK, 0, MAKEDWORD(x, y)).

1 голос
/ 26 апреля 2011

В этом сайте есть фрагмент кода . Попробуйте использовать функцию LeftClick() дважды подряд. Это делает трюк согласно этому парню .

0 голосов
/ 03 июля 2017

Поскольку моя «репутация» недостаточно высока (пока), я бы хотел прокомментировать решение # fardjad: оно прекрасно работает, но можно добавить следующее к «основной» подпрограмме:

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