Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UIAutomation-在事件处理程序中解除绑定事件_C#_Multithreading_Ui Automation_Microsoft Ui Automation - Fatal编程技术网

C# UIAutomation-在事件处理程序中解除绑定事件

C# UIAutomation-在事件处理程序中解除绑定事件,c#,multithreading,ui-automation,microsoft-ui-automation,C#,Multithreading,Ui Automation,Microsoft Ui Automation,我正在使用UIAutomation的C包装器来侦听事件 具体来说,我正在寻找一个焦点事件。当焦点事件发生时,我只需登录到控制台,然后解除事件绑定 问题是-程序似乎在automation.RemoveAllEventHandlers()调用上暂停/“死亡”。下面这行永远不会执行(不会打印到控制台,断点不会被命中) 我猜这是一个线程问题-自动化是在一个线程上创建的,但是该事件会在另一个线程上调用,随后会出现一个大问题。这就是问题所在吗?如果是/如果不是-是什么以及如何修复 代码如下: public

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

具体来说,我正在寻找一个焦点事件。当焦点事件发生时,我只需登录到控制台,然后解除事件绑定

问题是-程序似乎在
automation.RemoveAllEventHandlers()调用上暂停/“死亡”。下面这行永远不会执行(不会打印到控制台,断点不会被命中)

我猜这是一个线程问题-
自动化
是在一个线程上创建的,但是该事件会在另一个线程上调用,随后会出现一个大问题。这就是问题所在吗?如果是/如果不是-是什么以及如何修复

代码如下:

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();
            }
        }
    }
根据:

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

根据:

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