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