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
    }

Окно потоков:

Потоки

РЕШЕНИЕ НАЙДЕНО:

Пожалуйста, смотрите комментарии к найденному решению.

0 ответов

Другие вопросы по тегам