Я смотрю на портирование некоторого кода автоматизации, который я написал, используя pyautogui
, который перетаскивает мышь из начального местоположения в конечное местоположение. Я хочу использовать win32api для реализации этих же функций с помощью функции SendMessage
. ,Я смог успешно перенести событие click, но у меня возникли проблемы с реализацией перетаскивания.
Это игровой бот, который я пишу на Python. У меня есть доступ к окнам hwnd, а также к координатам, которые отображаются в правильных местах, которые необходимы. В настоящее время моя реализация фактически не перетаскивает и не выполняет никаких действий на экране.
evt_d = self.SUPPORTED_CLICK_EVENTS[button][0] # win32con.WM_LBUTTONDOWN
evt_u = self.SUPPORTED_CLICK_EVENTS[button][1] # win32con.WM_LBUTTONUP
start_param = win32api.MAKELONG(start[0], start[1]) # Starting location.
end_param = win32api.MAKELONG(end[0], end[1]) # Ending location.
# Moving the mouse to the starting position for the mouse drag.
# Mouse left button is DOWN after this point.
win32api.SendMessage(hwnd, evt_d, 1, start_param)
# Attempting to copy some of the implementation from pywinauto,
# to no avail...
for i in range(5):
win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 1, win32api.MAKELONG(start[0] + i, start[1]))
time.sleep(0.1)
win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 1, end_param)
time.sleep(0.1)
win32api.SendMessage(hwnd, evt_u, 0, end_param)
Я ожидаю, что на экране будет перетаскиваться мышь, в результате чего панель, открытая в данный момент в окне, будет перемещена. вверх или вниз, в зависимости от предоставленных координат.
ОБНОВЛЕНИЕ:
Итак, я провел немного больше исследований по этому вопросу, и похоже, что реализация, на которую я смотрел из pywinauto, не былаэто действительно не соответствует моим потребностям, и это имеет смысл, почему.
В зависимости от направления, которое вы перетаскиваете (ось x, ось y), вы хотите, чтобы ваш цикл сообщений либо прибавлял, либо вычитал из вашей координаты, и вы должныдобавить короткий time.sleep
вызов между каждым отправленным сообщением API.
Вот грубая реализация.
# Determine amount of mouse movements needed.
# Only supports Y axis dragging, X axis requires more conditionals.
if start[1] > end[1]:
down = True
clicks = start[1] - end[1]
else:
down = False
clicks = end[1] - start[1]
for i in range(clicks):
param = win32api.MAKELONG(start[0], start[1] - i if down else start[1] + i)
win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 1, param)
time.sleep(0.05) # A sleep is required here, or the message does nothing.
win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 1, end_param)
time.sleep(0.1)
win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, end_param)
Это работает, но может быть улучшено многими способами ... Я не смогчтобы найти какие-либо хорошие ссылки для этого онлайн, касающиеся выполнения этого в Python, если у кого-нибудь есть какие-либо дополнительные комментарии или идеи о том, как это можно сделать более изящно, я буду рад обратной связи!