我在进程内部监听自动化事件时遇到了问题。我写了一个简单的WPF应用程序,其中只有一个按钮。在窗口上添加了一个Automation处理程序,用于TreeScope:Descendants的Invoke事件。
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
IntPtr windowHandle = new WindowInteropHelper(this).Handle;
Task.Run(() =>
{
var element = AutomationElement.FromHandle(windowHandle);
Automation.AddAutomationEventHandler(InvokePattern.InvokedEvent, element, TreeScope.Descendants,
(s, a) =>
{
Debug.WriteLine($"Invoked:{a.EventId.Id}");
});
});
}
private void button_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Clicked!");
}
当我点击按钮时,这就是我得到的:
Invoked:20009
Clicked!
Invoked:20009
为什么会触发两次Invoked事件?
如果我删除Task.Run,我只会得到一次想要的结果,但是我已经在多个地方读到过不应该从UI线程调用自动化代码(例如https://msdn.microsoft.com/en-us/library/ms788709(v=vs.110).aspx)。在实际代码中这也是不切实际的。
在此示例中,我使用UIAComWrapper库,但是在使用UIAutomationClient库的托管版本和COM版本时我得到了相同的行为。