Ответы пользователя по тегу Windows
  • Как запустить .bat файл через pywinauto?

    vasily-v-ryabov
    @vasily-v-ryabov
    Python, UI Automation, pywinauto
    Скорее всего это типичная проблема launcher -> spawned child process. Нужно просто покурить параметры метода .start(...), чтобы он не ждал GUI в launcher процессе (кажется, wait_for_idle=False), а потом использовать метод .connect(...) уже по тайтлу окна, например, с таймаутом (оно же не мгновенно появится). Ну, или да, стартовать лончер модулем subprocess, чтоб ничего не курить.
    Ответ написан
    Комментировать
  • Какие есть кликеры или возможности автоматизровать?

    vasily-v-ryabov
    @vasily-v-ryabov
    Python, UI Automation, pywinauto
    Лучше всего настроить auto-logon и поставить, например, TightVNC. Он сохраняет активный десктоп, даже если отключиться. Выбор же библиотеки/языка зависит от GUI фреймворка, на котором сделано приложение. Если это нативное приложение (на MFC, WTL) и любите питон, то можно заюзать pywinauto (можно даже для свёрнутого окна какие-то действия делать, т.е. и при залоченной винде, но надо знать, какие). Если это WPF или WinForms, то для них в pywinauto есть backend="uia" (технология MS UI Automation под капотом).
    Ответ написан
    Комментировать
  • Как заставить работать SendKeys через RDP?

    vasily-v-ryabov
    @vasily-v-ryabov
    Python, UI Automation, pywinauto
    Для сохранения активного десктопа можно использовать VNC (например, мы пользуем TightVNC в качестве клиента и сервера) вместо RDP. Только, если всё же зашли по RDP, то потом надо перезагрузить сервер, чтобы VNC сессия нормально работала. А ещё скрипт на сервере нельзя запускать как сервис (из сервиса активный GUI context недоступен). Для VNC, возможно, ещё потребуется обновить видеодрова, т.к. он отображает реальный выход с видеокарты в отличие от виртуального RDP.

    Что касается pywinauto, то там SendKeys как раз использует системную функцию SendInput. В ветке UIA на гитхабе (релиз запланирован на июль) уже есть метод send_chars(...), который посылает WM_CHAR через SendMessage (работает для свёрнутого окна и при залоченной винде). Но этот метод нужно использовать для конкретного окна, а не просто глобально для системы. Пример:
    app = Application().start('notepad.exe')
    app.UntitledNotepad.Edit.send_chars('Hello World!') # не нужен GUI context
    app.UntitledNotepad.Edit.type_keys('\nTyping to the active window...', with_newlines=True) # нужен GUI context

    Вызов метода для конкретного контрола ещё и автоматически ждёт, когда окно/контрол реально появится и будет готов к вводу.
    Ответ написан
    2 комментария