在事件处理程序中解除绑定事件
本文关键字:绑定 事件 事件处理 程序 | 更新日期: 2023-09-27 18:18:18
我正在使用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();
}
}
}
根据:https://msdn.microsoft.com/en-us/library/windows/desktop/ee671692%28v=vs.85%29.aspx
在UI自动化事件处理程序中调用UI自动化是安全的,>因为事件处理程序总是在非UI线程中调用。然而,当订阅可能来自客户端应用程序UI的事件时,必须在非UI线程(也应该是MTA线程)上调用IUIAutomation::AddAutomationEventHandler或相关的>方法。删除同一线程上的事件处理程序。