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)
                {
                }
            });
        }
Пример #2
0
        private void SetFocusedWindow(IntPtr newWindow)
        {
            IntPtr oldWindow = focusedWindow;

            focusedWindow = newWindow;

            if (newWindow != oldWindow)
            {
                FocusedWindowChanged?.Invoke(this, new FocusedWindowEventArgs(oldWindow, newWindow));
            }
        }