UIACOMWrapper: InvalidOperationException при удалении AutomationEventHandler
Я использовал следующий код для ожидания открытия окна:
Automation.AddAutomationEventHandler(
WindowPattern.WindowOpenedEvent,
AutomationElement.RootElement,
TreeScope.Children,
(sender, e) =>
{
var element = sender as AutomationElement;
if (element.Current.Name != rolesFormTitle)
return;
Automation.RemoveAllEventHandlers();
SelectRoleOpenMainForm();
});
После добавления ссылки на UIAComWrapper v1.1.0.14 (с использованием Nuget) я начал получать это исключение (исходный код UIAComWrapper):
Внутреннее исключение - ноль. Это же исключение возникает для Factory.RemoveAllEventHandlers();
Должен ли я как-то подготовить состояние какого-либо объекта?
Update1:
Трассировки стека:
at UIAutomationClient.CUIAutomation8Class.RemoveAutomationEventHandler(Int32 eventId, IUIAutomationElement element, IUIAutomationEventHandler handler)
at System.Windows.Automation.Automation.RemoveAutomationEventHandler(AutomationEvent eventId, AutomationElement element, AutomationEventHandler eventHandler) in Automation.cs: line 239
Исходный код Automation.cs ( github):
public static void RemoveAutomationEventHandler(AutomationEvent eventId, AutomationElement element, AutomationEventHandler eventHandler)
{
Utility.ValidateArgumentNonNull(element, "element");
Utility.ValidateArgumentNonNull(eventHandler, "eventHandler");
Utility.ValidateArgument(eventId != AutomationElement.AutomationFocusChangedEvent, "Use FocusChange notification instead");
Utility.ValidateArgument(eventId != AutomationElement.StructureChangedEvent, "Use StructureChange notification instead");
Utility.ValidateArgument(eventId != AutomationElement.AutomationPropertyChangedEvent, "Use PropertyChange notification instead");
try
{
BasicEventListener listener = (BasicEventListener)ClientEventList.Remove(eventId, element, eventHandler);
Factory.RemoveAutomationEventHandler(eventId.Id, element.NativeElement, listener); // line 239
}
catch (System.Runtime.InteropServices.COMException e)
{
Exception newEx; if (Utility.ConvertException(e, out newEx)) { throw newEx; } else { throw; }
}
}
UPDATE2:
Исходный код:
private void Form1_Load(object send, EventArgs ev)
{
Process.Start("calc");
Automation.AddAutomationEventHandler(
WindowPattern.WindowOpenedEvent,
AutomationElement.RootElement,
TreeScope.Children, (sender, e) =>
{
var element = sender as AutomationElement;
if (!element.Current.Name.StartsWith("Calculator"))
return;
Automation.RemoveAllEventHandlers();
MessageBox.Show("BINGO!");
});
}
Я никогда не вижу сообщения "БИНГО!". Он висит на Automation.RemoveAllEventHandlers ();
Update3:
Еще висит:
private void Form1_Load(object send, EventArgs ev)
{
Process.Start("calc");
Automation.AddAutomationEventHandler(
WindowPattern.WindowOpenedEvent,
AutomationElement.RootElement,
TreeScope.Children, (sender, e) =>
{
var element = sender as AutomationElement;
if (!element.Current.Name.StartsWith("Calculator"))
return;
this.Invoke(new Action(() => RemoveTry()));
});
}
private void RemoveTry()
{
Automation.RemoveAllEventHandlers(); // reachable
MessageBox.Show("BINGO!"); // unreachable
}
Окно потоков:
РЕШЕНИЕ НАЙДЕНО:
Пожалуйста, смотрите комментарии к найденному решению.