Получение Python и AutoIT для совместной работы с помощью win32com: что случилось с этими дескрипторами окон?
у меня есть программа с интерфейсом GUI, начальную настройку которой мне нужно сделать вручную. AutoIt был великолепно полезен для этого до сих пор, так как он обеспечивает очень простые способы работы даже со сложными объектами GUI для доступа (выпадающие списки, меню отображения при наведении и т. д.).
однако скрипт, который мне в конечном итоге понадобится для выполнения настройки программы, должен будет быть передан большим массивом / списком переменных-есть много различных настроек, которые необходимо быть изменен.
Я настроил логику для решения того, что эти переменные настройки будут использовать скрипт Python. Теперь я пытаюсь понять, как заставить Python и AutoIt разговаривать друг с другом.
вызов пользовательского сценария AutoIt из командной строки с помощью Python в основном не может быть и речи из-за большого количества переменных, которые необходимо будет передать. Не очень-то приятно. Я мог бы попробовать и Python написать AutoIt "ключевой файл", который AutoIt мог бы затем прочитать чтобы установить его начальные переменные, но я хотел бы убедиться, что я исчерпал все опции для Python для работы непосредственно с AutoIt.
С этой целью я пытался использовать Python вместе с библиотекой win32com для взаимодействия с AutoIt. Кажется, что все работает хорошо-пока я ссылаюсь на окна / меню / объекты по их заголовкам строк, а не на их (память?) поручни. Это проблематично, так как мои сценарии настройки могут выполняться параллельно, настраивая два или более отдельных файлы одновременно. Если это так, откройте окно со строкой заголовка "открыть файл...- в каждом файле одновременно может быть путаница.
очевидным способом обойти это в AutoIt является работа с" ручками " рассматриваемых объектов, которые, я считаю, являются адресами памяти, а не их заголовками строк. Я предполагаю, что это адреса памяти как инструмент AutoIt Window Info, Когда указано на конкретное окно / параметр объекта GUI перечисляет шестнадцатеричный число как значение дескриптора объекта.
AutoIt имеет набор функций, которые вам на ручки окон, меню и т. д. Они реализованы в AutoIt COM dll, но я не смог заставить их работать в Python. Функции дескриптора возвращают объект unicode в Python, а не шестнадцатеричную строку, как в AutoIt. Я думаю, что именно по этой причине функции, которые затем пытаются использовать этот "дескриптор" в Python, не работают.
пример:
autoIt = win32com.client.Dispatch("AutoItX3.Control")
windowHandle = autoIt.WinGetHandle(knownWindowTitle)
returnedWindowTitle = autoIt.WinGetTitle(windowHandle)
обычно, returnedWindowTitle и knownWindowTitle не совпадают, поскольку returnedWindowTitle всегда кажется "0". что здесь происходит?
есть ли другие способы вызова пользовательских функций AutoIt, кроме использования win32com, командной строки или файла ключей AutoIt?
Спасибо за вашу помощь.
редактировать: я забыл упомянуть, что строки unicode действительно соответствуют шестнадцатеричным числам, которые я получаю, когда распечатываю переменную handle в AutoIt.
для например, в Python переменная handle при распечатке дает мне u'000C0326'. В AutoIt он дает мне "0x000C0326".
редактировать: некоторые испытания, основанные на предложениях Мата:
In: autoIt = win32com.client.Dispatch("AutoItX3.Control")
In: mainWindowTitle = "Untitled"
In: mainWindowHandle = autoIt.WinGetHandle(mainWindowTitle)
In: mainWindowHandle
Out: u'000204AC'
In: testHandle = int(mainWindowHandle, 16)
In: testHandle
Out: 132268
In: autoIt.WinGetTitle(testHandle)
Out: u'0'
редактировать: я узнал тип объекта дескриптора окна: это объект Microsoft HWND. AutoIt имеет функцию, которая может "преобразовать" базовое число 16 в объект HWND (т. е. найти объект HWND с этим базовым номером 16 memory/handle/etc.). Мне просто повезло, что они не поместили эту функцию в AutoItX (com dll). Итак, если я действительно хочу запустить с этим, я должен попытаться выяснить, как вернуть любой объект, на который указывает базовый адрес 16, а затем передать его правильным способом в AutoItX? Я, вероятно, звучу очень смущенно, потому что все это не очень ясно в моей голове прямо сейчас.
2 ответов
для поиска я опубликую решение, которое я нашел.
вот код:
In: autoIt = win32com.client.Dispatch("AutoItX3.Control")
In: autoIt.AutoItSetOption("WinTitleMatchMode", 4)
In: mainWindowTitle = "Untitled"
In: mainWindowHandle = autoIt.WinGetHandle(mainWindowTitle)
In: mainWindowHandle
Out: u'000204AC'
In: testHandle = "[HANDLE:%s]" % mainWindowHandle
In: autoIt.WinGetTitle(testHandle)
Out: u'Untitled - Notepad'
autoIt.AutoItSetOption("WinTitleMatchMode", 4)
говорит autoit использовать расширенное сопоставление заголовков, что позволяет нам указать дескриптор окна с [HANDLE:000204AC]
строку.
не нужно фактический ручка окна здесь.
кстати, я обнаружил это решение, наткнувшись на данное сообщение на форуме. Я обнаружил, что часто полезно не ограничивать мои поиск на конкретном языке, который я ищу. В большинстве случаев решение можно найти на другом языке, который можно легко перенести на язык по вашему выбору.
тип дескрипторов окон-string. Причина этого-WinList возвращает как дескриптор окна, так и заголовок окна. Заголовок не может быть помещен в тип дескриптора, но дескриптор может быть помещен в строковый тип (для заголовка). Я предполагаю, что они взяли это описание дизайна и применили его к другим функциям. Если вы посмотрите документацию для WinGetHandle, она скажет вам тип возврата для дескриптора: это строка.
AutoIt имеет функцию, которая может "преобразовать" базовое число 16 в объект HWND.
точно! Это ключ. AutoIt делает это за вас. Вы пытаетесь преобразовать дескриптор во что-то полезное для AutoIt, но AutoIt уже может использовать эти дескрипторы, хранящиеся в виде строк.
ваш тест должен быть:
In: autoIt = win32com.client.Dispatch("AutoItX3.Control")
In: mainWindowTitle = "Untitled"
In: mainWindowHandle = autoIt.WinGetHandle(mainWindowTitle)
In: mainWindowHandle
Out: u'000204AC'
In: autoIt.WinGetTitle(mainWindowHandle)
Out: u'Untitled - Notepad'
когда вы хотите использовать этот дескриптор в других библиотеках, вы можете столкнуться с некоторыми проблемами. Я бы рекомендовал вам попробовать разобрать число, как вы это сделали в своих тестах, и пройти это вместе. AutoIt достаточно "умный", чтобы понять, что делать в большинстве случаев, возможно, библиотека не является.