private async void OnFocusChanged(object sender, AutomationFocusChangedEventArgs e) { _focusSource?.Cancel(); var source = new CancellationTokenSource(); _focusSource = source; await Task.Run(async() => { try { if (source.IsCancellationRequested) { return; } Debug.WriteLine("focus changed"); var focusedElement = sender as AutomationElement; if (focusedElement == null) { return; } var window = GetTopLevelWindow(focusedElement, source); if (source.IsCancellationRequested) { return; } if (window == null) { Debug.WriteLine("Null window"); return; } if (_focusedWindow == window) { Debug.WriteLine("Same window"); //return; } try { if (_focusedWindow != null) { Automation.RemoveStructureChangedEventHandler(_focusedWindow, OnStructureChanged); } } catch (ArgumentException ex) { } _focusedWindow = window; FocusedWindowChanged?.Invoke(this, _focusedWindow); await Update(); Automation.AddStructureChangedEventHandler(_focusedWindow, TreeScope.Subtree, OnStructureChanged); } catch (COMException) { } }); }
private void SetFocusedWindow(IntPtr newWindow) { IntPtr oldWindow = focusedWindow; focusedWindow = newWindow; if (newWindow != oldWindow) { FocusedWindowChanged?.Invoke(this, new FocusedWindowEventArgs(oldWindow, newWindow)); } }