Что нового

Взаимодействие C# с AutoIT

mfcs

Новичок
Сообщения
15
Репутация
0
Раньше я пользовался autoIt, писал разного рода скрипты, но, уже довольно давно пишу на c#, и иногда использую в нем библиотеку AutoItX3.dll. Узнать решение хотел еще давно, но не доходили руки написать куда нибудь. В общем, на c# я часто использую многопоточность (await, new Thread.Start() и т.д.), но почему то, любой метод из библиотеки AutoIt, работает только в основном потоке. Грубо говоря, если я использую await что бы приложение с интерфейсом не зависало, выполняя большое колличество кода, а что бы код выполнялся в другом потоке, и если в нем доходит дело к примеру до WinWait("window"), программа виснит, будто выполнение происходит в основном потоке, инорируя любые способы выполнения кода в другом. По факту, я не могу сказать что проблема в этом, но поверхностно, кажется что именно так. Да и плюс к этому, в autoIt, насколько я знаю, нету многопоточности. Буду благодарен за помощь :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,885
Репутация
1,195
Причину вряд ли определит AutoIt3 пользователи, скорее разработчикам задать вопрос, и то скажут "не известно что у вас там в коде", может на вашей стороне проблема. Но именно WinWait написать то не так уж сложно, обычный поиск окон через промежуток времени, пока не получишь результат или по истечении таймера. Можно через перечисление окон EnumWindows, EnumChildWindows или через FindWindow, FindWindowEx
 
Автор
M

mfcs

Новичок
Сообщения
15
Репутация
0
Причину вряд ли определит AutoIt3 пользователи, скорее разработчикам задать вопрос, и то скажут "не известно что у вас там в коде", может на вашей стороне проблема. Но именно WinWait написать то не так уж сложно, обычный поиск окон через промежуток времени, пока не получишь результат или по истечении таймера. Можно через перечисление окон EnumWindows, EnumChildWindows или через FindWindow, FindWindowEx
Да, я знаю что можно все это создать самому. Просто у библиотеки user32.dll есть некоторые приколы, например с активацией окон, поэтому куда удобнее написать WinActivate("window"). И честно говоря, обидно не использовать опыт что у меня есть от пользования autoIt :d
 

AZJIO

Меценат
Меценат
Сообщения
2,885
Репутация
1,195
куда удобнее написать
А что на C# разве нет готовых решений? На PureBasic например SetWindowFocus, там используются WinAPI функции, просто найти готовые примеры используя имена функций или переписать с другого языка, они в принципе похожи. Конкретно для WinWait я писал похожее WinGetHandle, хотя вроде с FindWindow будет в разы проще, у меня просто необходимости не было. Для PureBasic написан PureAutoIt, при желании там могу взять, но я пару раз встречал там не оптимизированные решения, поэтому прибегаю в крайнем случае, к пример функцию Send я взял оттуда и обрезал её в десятки раз, она там чуть ли не 500 строк, я укоротил до пары десятков нужного мне функционала.
На счёт AutoItX3.dll хотел попробовать, но там во первых не все функции, которые были нужны там их не было, а во вторых теряется смысл писать на компилируемом языке компактные кроссплатформенные файлы, чтобы притягивать либу на 700 кб и с потерей кроссплатформенности, когда у меня проги в среднем от 60 до 200кб. Я даже не подключаю движок регулярных выражений и всегда стараюсь написать свой анализатор, так как вместо 1 кб (моего анализатора) исполняемый файл увеличится на 150-200 кб в зависимости от разрядности. Буквально на днях писал функцию IsDomain - 40 строк, 5,5 кб при компиляции одной функции, при чём пустой код "x+1" компилируется тоже размером 5 кб, это грубо говоря масса брутто, тара 5 кб и кода на пол-килобайта.
 
Верх