private void OnFocusChanged(object sender, AutomationFocusChangedEventArgs e) { try { AutomationElement elementFocused = sender as AutomationElement; if (IsInvalidAutomationElement(elementFocused)) { return; } AutomationElement newTopLevelWindow = GetTopLevelWindow(elementFocused); if (IsInvalidAutomationElement(newTopLevelWindow)) { return; } if (newTopLevelWindow != lastTopLevelWindow) { if (IsExplorerWindow(lastTopLevelWindow)) { RemoveSelectionEvenhandler(lastTopLevelWindow); } if (IsExplorerWindow(newTopLevelWindow)) { Debug.WriteLine("Focus moved to new top-level explorer window " + newTopLevelWindow.Current.Name); AddSelectionEvenhandler(newTopLevelWindow); ExplorerWindowGotFocus?.Invoke(this, new IntPtr(newTopLevelWindow.Current.NativeWindowHandle)); } else { Debug.WriteLine("Focus moved to new top-level non-explorer window " + newTopLevelWindow.Current.Name); } lastTopLevelWindow = newTopLevelWindow; } } catch (ElementNotAvailableException ex) { Debug.WriteLine("SelectionMonitor: Fail OnFocusChanged " + ex.ToString()); } }
private void OnMessage(XDMessageEventArgs msg) { if (msg.DataGram.Channel == "SelectionOfExplorerWindowChanged") { if (int.TryParse(msg.DataGram.Message, out int hwndInteger)) { IntPtr hwnd = new IntPtr(hwndInteger); ExplorerSelectionChanged?.Invoke(this, new ExplorerMonitorEventArgs(hwnd)); } } else if (msg.DataGram.Channel == "ExplorerWindowGotFocus") { if (int.TryParse(msg.DataGram.Message, out int hwndInteger)) { IntPtr hwnd = new IntPtr(hwndInteger); ExplorerWindowGotFocus?.Invoke(this, new ExplorerMonitorEventArgs(hwnd)); } } }