Проблема сохранения потока UIAutomation
Я пытаюсь написать консольное приложение для автоматизации существующего графического интерфейса. Я получаю следующую ошибку, когда пытаюсь выбрать элемент дерева в графическом интерфейсе приложения.
Система.Время Выполнения.InteropServices.Исключение comexception (0x8001010D): исходящий вызов не может быть выполнено, так как приложение обрабатывает входящий синхронный вызов. (Исключение из HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL))
Вот код, который выбирает элемент дерева:
AutomationElement elementNode = TreeWalker.RawViewWalker.GetFirstChild(SensorTreeCollection); SelectionItemPattern selectElement; while (elementNode != null) { try { Console.Out.WriteLine("node of type " + elementNode.Current.ControlType.LocalizedControlType + " with name of " + elementNode.Current.Name); sw.WriteLine(elementNode.Current.Name); try { selectElement = elementNode.GetCurrentPattern(SelectionItemPattern.Pattern) as SelectionItemPattern; selectElement.Select(); } catch (InvalidOperationException) { return; } } catch (Exception e) { Console.Out.WriteLine("{0} Exception caught.", e); } elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode); }
Из того, что я могу сказать, ошибка возникает из-за того, что я делаю изменение в графическом приложении из другого потока и что для этого мне нужно использовать потокобезопасную реализацию. К сожалению, в лучшем случае я новичок в резьбе и не понимаю, как лучше всего это сделать. Кто-нибудь может помочь?
Я расширил код, включив автоматику treewalker. Ошибка возникает при вызове selectElement.select ().
Я посмотрел на делегатов и метод Invoke, но не знаю, как адаптировать control.invoke() для использования с AutomationElement. Есть ли какой-то способ привести AutomationElement к элементу управления, чтобы он мог получить доступ к invoke?