我无法从流程内部收听自动化事件.我在下面写了一个示例,其中有一个带有单个按钮的简单WPF应用程序.使用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版都有相同的行为.