Почему win32api.SendMessage не может выполнять щелчки мыши в некоторых приложениях

#python #python-3.x #automation

#python #python-3.x #автоматизация

Вопрос:

Я использую ОС Windows и пытаюсь выполнять щелчки по фоновым (неактивным) приложениям, не выводя их на передний план. Мне удалось выполнить in в Microsoft Paint (рисование точки на минимизированном экземпляре paint), но по какой-то причине это, похоже, не работает в приложении на основе Java (RuneLite.exe ), для которого я пишу эту программу.

Некоторая дополнительная информация:

  • У Paint много дочерних окон, и выполнение щелчка, похоже, работает только тогда, когда я выполняю его в определенном дочернем окне (класс: Afx: 00007FF758890000: 8) это самое внутреннее окно.
  • Структура окна RuneLite выглядит следующим образом:
    • RuneLite (класс: SunAwtFrame)
      • неизвестно (класс: SunAwtCanvas)
        • неизвестно (класс SunAwtCanvas)
  • Я пытался использовать дескриптор всех 3-х вышеупомянутых окон, но, похоже, ни одно из них не работает
  • Код способен находить дескриптор окна, и он корректен (проверено с помощью Spy )
  • Окно мигает оранжевым цветом на панели задач после запуска кода, поэтому, должно быть, было запущено какое-то событие
  • Я определил координаты, сделав скриншот окна и используя paint для поиска координат определенного местоположения. (Если есть лучший способ сделать это, пожалуйста, дайте мне знать)
 from pywinauto.application import Application

amount = 2
handles = []

def start_apps():
    for i in range(amount):
        a = Application()
        a.start("D:\Users\Arno\AppData\Local\RuneLite\RuneLite.exe")
        time.sleep(15)
        handle = a.window().child_window(class_name="SunAwtCanvas", found_index=1).handle # select the most inner window
        handles.append(handle)


def do_click(h, x, y):
    long_position = win32api.MAKELONG(x, y)  # simulate the mouse pointer and send it to the specified coordinates
    win32api.SendMessage(h, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)  # simulate mouse press
    win32api.SendMessage(h, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)  # Simulate mouse up


start_apps()
print(handles)
time.sleep(20)
for h in handles:
    do_click(h, 450, 290)
  

Вывод кода

Кто-нибудь знает, почему это происходит и как я мог бы это исправить?