Ошибка автоматизации пользовательского интерфейса: исходящий вызов не может быть выполнен, так как приложение отправляет синхронный входной вызов

Я пытаюсь автоматизировать навигацию по пользовательскому интерфейсу для приложения, которое само звонит в coms.

Когда я автоматизирую щелчок (который запускает поиск, чтобы увидеть, какие устройства подключены к сети), я получаю следующую всплывающую ошибку:

Исходящий вызов не может быть выполнен, так как приложение отправляет вызов, синхронный с вводом.

Строка кода, которая не работает, выглядит следующим образом:

Get-UiaButton -AutomationId '136' -Class 'Button' -Name 'Search Now' -Win32 | Invoke-UIAButtonClick

Проведенное мной исследование предполагает, что это проблема многопоточной квартиры. Powershell 2 изначально работает в MTA. В то время как powershell 3/4 изначально работает в STA. Я попытался запустить команду в обеих средах, и она не работает одинаково.

Дальнейшие исследования показывают, что кто-то пытается отправить сообщение из потока неверного типа. Единственные сообщения, которые я могу контролировать, это те, которые генерируются вызовом Get-UIAButton. Я попытался отключить сообщения объекта, используя

[UIAutomation.Preferences]::UseElementsPatternObjectModel = $false
[UIAutomation.Preferences]::UseElementsSearchObjectModel = $false

Однако две линии все еще проходят

Current        : UIAutomation.UiElementInformation
__interceptors : {UIAutomation.MethodSelectorAspect, UIAutomation.ErrorHandlingAspect}

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

Я попытался перенаправить вывод на | Out-Null... и все равно выдает ту же ошибку.

Я также попытался запустить команду во втором экземпляре powershell.

powershell.exe -mta -nologo -noprofile -executionpolicy bypass -command "ipmo C:\Users\Admin\Downloads\UIAutomation.0.8.7B3.NET35b\UIAutomation.dll; Get-UiaButton -AutomationId '136' -Class 'Button' -Name 'Search Now' -Win32 | Invoke-UIAButtonClick"

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


person Dee Dee    schedule 18.02.2015    source источник
comment
Чтобы ответить на этот вопрос, нам нужно больше узнать о контексте кода, вызывающего Get-UiaButton. Есть соответствующий вопрос здесь - по сути, вы не можете вызывать UIA (или любой межпроцессный COM) из кода, который вызывается через SendMessage.   -  person Eric Brown    schedule 16.03.2015
comment
Спасибо. Чего я не понимаю, так это того, что вызывает метод SendMessage. Таким образом, Get-UiaButton — это просто часть обычного скрипта PowerShell uiautomtion. Один вызов за другим, чтобы сделать клики в приложении Windows. Все эти клики работают нормально (клики, которые настраивают параметры для поиска в приложении), пока не будет нажата кнопка «Искать сейчас». Теперь я знаю, что это приложение обращается к COMM для сбора информации для поиска, но должны ли сценарий powershell и приложение Windows мешать друг другу?   -  person Dee Dee    schedule 17.03.2015
comment
Вот почему нам нужно увидеть код, вызывающий Get-UiaButton. Также возможно проблема в тестируемом приложении. Если он проводит много времени в обработчике, вызываемом sendmessage (возможно, при выполнении вложенного цикла сообщений), то обратный вызов UIA (необходимый для отправки данных автоматизации обратно из целевого приложения в ваш скрипт powershell) может нарушать ограничение исходящих вызовов. . Опять же, нам нужно больше информации, чтобы рассказать.   -  person Eric Brown    schedule 17.03.2015
comment
Приложение Windows является сторонним. На самом деле я не столько тестирую, сколько автоматизирую сбор данных, чтобы затем использовать их для проверки нашего кода. Существуют ли инструменты отладки, которые позволили бы мне исследовать, что делает это приложение или какие ресурсы оно потребляет, не имея доступа к исходному коду? Мой сценарий powershell буквально представляет собой длинный список Get-UIA**** | Invoke-Uia*** внутри try catch. Я рад связать его, если вы думаете, что это поможет.   -  person Dee Dee    schedule 18.03.2015
comment
В порядке. Одна вещь, которую вы можете попробовать, это использовать Invoke-UIAControlClick для отправки кликов мыши вместо прямого вызова кнопки. Или кнопка недоступна до сбоя Get-UiaButton?   -  person Eric Brown    schedule 19.03.2015