Заставляем Python и AutoIT работать вместе с помощью win32com: что случилось с этими оконными дескрипторами?

У меня есть программа с графическим интерфейсом пользователя, первоначальную настройку которой мне нужно выполнить вручную. AutoIt оказался для этого чрезвычайно полезным, поскольку он обеспечивает очень простые способы работы даже со сложными для доступа объектами графического интерфейса (раскрывающиеся списки, меню, появляющиеся при наведении курсора и т. Д.).

Однако скрипту, который мне в конечном итоге понадобится для настройки программы, нужно будет передать большой массив / список переменных - есть много различных настроек, которые необходимо быть изменен.

Я установил логику для решения, какие эти установочные переменные будут использовать скрипт Python.Теперь я пытаюсь понять, как заставить Python и AutoIt общаться друг с другом.

О вызове пользовательского сценария AutoIt из командной строки с использованием Python в большинстве случаев не может быть и речи из-за большого количества переменных, которые необходимо передать. Не чувствую себя красивой. Я мог бы попытаться заставить Python написать «ключевой файл» AutoIt, который AutoIt мог бы затем прочитать, чтобы установить свои начальные переменные, но я хотел бы убедиться, что я исчерпал все возможности Python для непосредственной работы с AutoIt в первую очередь.

С этой целью я пытался использовать Python вместе с библиотекой win32com для взаимодействия с AutoIt. Кажется, что все работает хорошо - пока я ссылаюсь на окна / меню / объекты по их строковым заголовкам, а не по их (памяти?) Дескрипторам. Это проблематично, так как мои сценарии настройки могут выполняться параллельно, создавая два или более отдельных файла одновременно. В этом случае одновременное открытие окна со строкой заголовка «Открыть файл ...» в каждом файле может сбить с толку.

Очевидный способ обойти это в AutoIt - работать с «дескрипторами» рассматриваемых объектов, которые, как мне кажется, являются адресами памяти определенного типа, а не их строковыми заголовками. Я предполагаю, что это адреса памяти, поскольку инструмент AutoIt Window Info при указании на конкретную опцию объекта Window / GUI перечисляет шестнадцатеричное число в качестве значения дескриптора объекта.

AutoIt имеет набор функций, которые получают дескрипторы окон, меню и т. Д. Они реализованы в DLL AutoIt COM, но мне не удалось заставить их работать в Python.Функции дескриптора возвращают объект Unicode в Python, а не шестнадцатеричную строку, как в AutoIt. Я думаю, что это причина того, почему функции, которые затем пытаются использовать этот «дескриптор» в Python, не работают.

Пример:

autoIt = win32com.client.Dispatch("AutoItX3.Control")
windowHandle = autoIt.WinGetHandle(knownWindowTitle)
returnedWindowTitle = autoIt.WinGetTitle(windowHandle)

Обычно returnWindowTitle и известноеWindowTitle не совпадают, поскольку returnWindowTitle всегда кажется равным «0». что здесь происходит?

Есть ли у меня другие способы вызова пользовательских функций AutoIt, кроме использования win32com, командной строки или ключевого файла AutoIt?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ : я забыл упомянуть, что строки Unicode действительно соответствуют шестнадцатеричным числам, которые я получаю, когда распечатываю переменную дескриптора в AutoIt.

Например, в Python переменная дескриптора при распечатке дает мне 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, память / дескриптор / и т. Д.). Мне просто повезло, что они не поместили эту функцию в AutoItX (COM dll). Итак, если я действительно хочу работать с этим, мне нужно будет попытаться выяснить, как вернуть любой объект, на который указывает базовый адрес 16, а затем передать его правильным образом в AutoItX? Я, наверное, выгляжу очень сбитым с толку, потому что все это сейчас не очень ясно в моей голове.

10
задан 13 January 2012 в 20:15
поделиться