Подтвердить что ты не робот

Win32: имитировать клик без имитации движения мыши?

Я пытаюсь имитировать щелчок мышью по окну. В настоящее время я успешно выполняю это следующим образом (я использую Python, но он должен применяться к общему win32):

win32api.SetCursorPos((x,y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

Это прекрасно работает. Однако, если щелчок происходит, когда я перемещаю мышь вручную, позиция курсора отбрасывается. Есть ли способ отправить клик непосредственно в заданную координату (x,y), не перемещая мышь там? Я пробовал что-то вроде следующего с большой удачей:

nx = x*65535/win32api.GetSystemMetrics(0)
ny = y*65535/win32api.GetSystemMetrics(1)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | \
                     win32con.MOUSEEVENTF_ABSOLUTE,nx,ny)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | \
                     win32con.MOUSEEVENTF_ABSOLUTE,nx,ny)
4b9b3361

Ответ 1

Попробуйте функцию WindowFromPoint():

POINT pt;
    pt.x = 30; // This is your click coordinates
    pt.y = 30;

HWND hWnd = WindowFromPoint(pt);
LPARAM lParam = MAKELPARAM(pt.x, pt.y);
PostMessage(hWnd, WM_RBUTTONDOWN, MK_RBUTTON, lParam);
PostMessage(hWnd, WM_RBUTTONUP, MK_RBUTTON, lParam);

Ответ 2

Это не отвечает на вопрос, но он решает мою проблему:

win32api.ClipCursor((x-1,y-1,x+1,y+1))
win32api.SetCursorPos((x,y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN| \
                     win32con.MOUSEEVENTF_ABSOLUTE,0,0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP| \
                     win32con.MOUSEEVENTF_ABSOLUTE,0,0)
win32api.ClipCursor((0,0,0,0))

В результате все движения, которые я делаю, не будут мешать щелчку. Недостатком является то, что мое фактическое движение будет испорчено, поэтому я по-прежнему открыт для предложений.