win32: имитировать щелчок без симуляции движения мыши? - PullRequest
11 голосов
/ 15 сентября 2010

Я пытаюсь смоделировать щелчок мышью по окну. В настоящее время у меня есть успех, делая это следующим образом (я использую 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)

Ответы [ 2 ]

9 голосов
/ 15 сентября 2010

Попробуйте функцию 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);
3 голосов
/ 15 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...