private static void WindowHidden(IntPtr hwnd) { Logger.Verbose($"Processing newly hidden window ({hwnd})..."); var windowInfo = Find(hwnd); if (windowInfo == null) { var message = $"This window was not handled by the {nameof(WindowManager)} ({hwnd})"; Logger.Verbose(message); return; } windowInfo.IsShown = false; windowInfo.WindowClosed.SetResult(0); AllWindowsList.Remove(windowInfo); if (MainWindow != null && MainWindow.Equals(windowInfo)) { Logger.Info($"Main window closed. ({hwnd})"); MainWindow = null; MainWindowChanged?.Invoke(null, new WindowManagerEventArgs(MainWindow)); } else { var index = ModalWindowsList.IndexOf(windowInfo); if (index >= 0) { var childModal = index < ModalWindows.Count - 1 ? ModalWindows[index + 1] : null; var parentModal = index > 0 ? ModalWindows[index - 1] : MainWindow; if (childModal != null) { childModal.Owner = parentModal; if (parentModal != null) { parentModal.IsDisabled = true; } } else if (parentModal != null) { parentModal.IsDisabled = false; } ModalWindowClosed?.Invoke(null, new WindowManagerEventArgs(windowInfo)); ModalWindowsList.RemoveAt(index); var nextWindow = ModalWindows.FirstOrDefault(x => x.Hwnd != IntPtr.Zero && x.IsVisible) ?? MainWindow; if (nextWindow != null && nextWindow.Hwnd != IntPtr.Zero) { NativeHelper.SetActiveWindow(nextWindow.Hwnd); } Logger.Info($"Modal window closed. ({hwnd})"); } } }
private static void WindowShown(IntPtr hwnd) { if (!HwndHelper.HasStyleFlag(hwnd, NativeHelper.WS_VISIBLE)) { Logger.Debug($"Discarding non-visible window ({hwnd})"); return; } Logger.Verbose($"Processing newly shown window ({hwnd})..."); var windowInfo = Find(hwnd); if (windowInfo == null) { windowInfo = new WindowInfo(hwnd); if (Debugger.IsAttached) { foreach (var debugWindowTypeName in DebugWindowTypeNames) { if (windowInfo.Window?.GetType().FullName.StartsWith(debugWindowTypeName) ?? false) { Logger.Debug($"Discarding debug/diagnostics window '{windowInfo.Window.GetType().FullName}' ({hwnd})"); return; } } } AllWindowsList.Add(windowInfo); } windowInfo.IsShown = true; if (windowInfo == MainWindow) { Logger.Info("Main window shown."); MainWindowChanged?.Invoke(null, new WindowManagerEventArgs(MainWindow)); } else { if (windowInfo.IsModal) { // If this window has not been shown using a WindowManager method, add it as a top-level modal window if (!ModalWindows.Any(x => x.Equals(windowInfo))) { var lastModal = ModalWindows.LastOrDefault() ?? MainWindow; if (lastModal != null) { windowInfo.Owner = lastModal; lastModal.IsDisabled = true; } ModalWindowsList.Add(windowInfo); Logger.Info($"Modal window shown. (standalone) ({hwnd})"); } else { var index = ModalWindowsList.IndexOf(windowInfo); var childModal = index < ModalWindows.Count - 1 ? ModalWindows[index + 1] : null; var parentModal = index > 0 ? ModalWindows[index - 1] : MainWindow; if (childModal != null) { childModal.Owner = windowInfo; windowInfo.IsDisabled = true; // We're placing another window on top of us, let's activate it so it comes to the foreground! if (childModal.Hwnd != IntPtr.Zero) { NativeHelper.SetActiveWindow(childModal.Hwnd); } } if (parentModal != null) { parentModal.IsDisabled = true; } Logger.Info($"Modal window shown. (with WindowManager) ({hwnd})"); } ModalWindowOpened?.Invoke(null, new WindowManagerEventArgs(windowInfo)); } } }