UIAutomation - 事件处理程序中的解除绑定事件

时间:2015-10-19 18:20:19

标签: c# multithreading ui-automation microsoft-ui-automation

我正在使用UIAutomation的C包装器来监听事件。

具体来说,我正在寻找一个焦点事件。当焦点事件发生时,我只是登录到控制台,并取消绑定事件。

问题是 - 程序似乎在automation.RemoveAllEventHandlers()电话上停止/“死”。下面的行永远不会被执行(不打印到控制台,断点不会被击中。)

我的猜测是这是一个线程问题 - 在一个线程上创建了automation,但事件在另一个线程上被调用,随之而来的是一个大问题。这是问题吗?如果是这样/如果不是 - 我是什么以及如何解决它?

以下是代码:

public class FocusListener
    {
        private readonly CUIAutomation _automation;

        public FocusListener()
        {
            _automation = new CUIAutomation();

            _automation.AddFocusChangedEventHandler(null, new FocusChangeHandler(this));
            Console.WriteLine("Added a focus event!");
        }

        public void On_WindowClicked()
        {
            Console.WriteLine("Window clicked!");
            _automation.RemoveAllEventHandlers(); // program seems to die right here..
            Console.WriteLine("Focus event removed"); // this line never gets executed..
        }
    }

    public class FocusChangeHandler : IUIAutomationFocusChangedEventHandler
    {
        private readonly FocusListener _listener;

        public FocusChangeHandler(FocusListener listener)
        {
            _listener = listener;
        }

        public void HandleFocusChangedEvent(IUIAutomationElement sender)
        {
            if (sender.CurrentControlType == UIA_ControlTypeIds.UIA_WindowControlTypeId)
            {
                _listener.On_WindowClicked();
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

根据:https://msdn.microsoft.com/en-us/library/windows/desktop/ee671692%28v=vs.85%29.aspx

  

在UI自动化事件处理程序中进行UI自动化调用是安全的,因为事件处理程序总是在非UI线程上调用。但是,当>订阅可能来自客户端应用程序UI的事件时,您必须在非UI线程(也应该是MTA)上调用IUIAutomation :: AddAutomationEventHandler或相关的>方法。线)。在同一个帖子上删除事件>处理程序。