Как мне реализовать фоновые перетаскивания мышью по окну с win32api - PullRequest
0 голосов
/ 25 октября 2019

Я смотрю на портирование некоторого кода автоматизации, который я написал, используя 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, если у кого-нибудь есть какие-либо дополнительные комментарии или идеи о том, как это можно сделать более изящно, я буду рад обратной связи!

...