Как отправить DirectInput в pywinauto?

Я хочу сделать программу, что может отправлять симулированные нажатия в минимизированное!!! окно, оно должно работать в свернутом режиме!!!.

Для примера запустил Minecraft 1.12.2, взял за основу код отсюда: https://github.com/learncodebygaming/multiple-minimized-windows/blob/main/main.py, но ничего кроме букв в чат не смог добиться. Для них, как я понял, непринципиально, используешь ты директ или обычный инпут. Успешное печатание букв в чат

Но вот для совершения действий, таких как прыжок, нужен именно директ инпут. Нигде не нашел, как отправить его в приложение.

from time import sleep
import win32gui, win32ui, win32con, win32api


def main():
    window_name = "Minecraft 1.12.2"
    hwnd = win32gui.FindWindow(None, window_name)
    win = win32ui.CreateWindowFromHandle(hwnd)

    win.SendMessage(win32con.WM_CHAR, ord('B'), 0)


def list_window_names():
    def winEnumHandler(hwnd, ctx):
        if win32gui.IsWindowVisible(hwnd):
            print(hex(hwnd), '"' + win32gui.GetWindowText(hwnd) + '"')
    win32gui.EnumWindows(winEnumHandler, None)


def get_inner_windows(whndl):
    def callback(hwnd, hwnds):
        if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
            hwnds[win32gui.GetClassName(hwnd)] = hwnd
        return True
    hwnds = {}
    win32gui.EnumChildWindows(whndl, callback, hwnds)
    return hwnds
sleep(2)
main()

Ответы (2 шт):

Автор решения: syaveloo

Немного покопавшись в интернете, я все-таки нашел решение проблемы - метод win32gui.PostMessage()

def main(name="Minecraft 1.12.2"):
    window_name = name
    hwnd = win32gui.FindWindow(None, window_name)

    while True:
        win32gui.PostMessage(hwnd,win32con.WM_RBUTTONDOWN,win32con.MK_RBUTTON,0)
        time.sleep(0.5)

Сообщения корректно отправляются в окно с майнкрафтом, удочка в воду закидывается, бот для авто-рыбалки готов.

Для уверенности протестировал в Crossout, код не подвел.

→ Ссылка
Автор решения: Vasily Ryabov

Если вкратце, то код на pywinauto должен выглядеть примерно так:

from pywinauto import Desktop

Desktop(backend="win32").window(title="Minecraft 1.12.2").click(button="left", coords=(x, y))

По умолчанию используется параметр absolute=False, то есть координаты считаются от левого верхнего угла окна (а не экрана). В некоторых приложениях с пересчётом координат могут быть проблемы (знаю всего один такой случай), но в авто тестах это точно работает на тестовых приложениях.

→ Ссылка