using System; using System.Drawing; using System.Collections.Generic; using System.Text; // The 'windowHandle' parameter will contain the window handle for the: // - Active window when run by hotkey // - Window Location target when run by a Window Location rule // - TitleBar Button owner when run by a TitleBar Button // - Jump List owner when run from a Taskbar Jump List // - Currently focused window if none of these match public static class DisplayFusionFunction { //an enum to set the script state private enum ScriptState { Normal = 0, Minimized = 1 } public static void Run(IntPtr windowHandle) { //constants to set and get the window state property const string windowStateProperty = "MinimizeAndRestoreWindows_WindowState"; //random values to use as property values const int normalState = 432985; const int maximizedState = 347561; //if the script is in it's minimized state, restore the saved window positions if (IsScriptInMinimizeState()) { //loop over every window foreach (IntPtr window in BFS.Window.GetAllWindowHandles()) { // Skip DisplayFusion windows and hidden explorer windows if(IsDisplayFusionWindowOrHiddenExplorerWindow(window)) continue; //check for a saved property IntPtr windowState = BFS.Window.GetWindowProperty(window, windowStateProperty); //if we couldnt find a property, continue to the next window if (windowState == IntPtr.Zero) continue ; //if the window was in a normal state, restore it if (windowState.ToInt64() == normalState) BFS.Window.Restore(window); //if the window was in a maximized state, maximize it if (windowState.ToInt64() == maximizedState) BFS.Window.Maximize(window); //remove the property from the window BFS.Window.RemoveWindowProperty(window, windowStateProperty); } //reset the script state SetScriptState(ScriptState.Normal); //exit the script return; } //if we got to this point we should save all of the windows, then minimize them //loop through all of the visiable windows, save their state, then minimize then foreach (IntPtr window in BFS.Window.GetVisibleWindowHandles()) { // Skip DisplayFusion windows and hidden explorer windows if(IsDisplayFusionWindowOrHiddenExplorerWindow(window)) continue; if (BFS.Window.IsMaximized(window)) BFS.Window.SetWindowProperty(window, windowStateProperty, new IntPtr(maximizedState)); if (BFS.Window.IsRestored(window)) BFS.Window.SetWindowProperty(window, windowStateProperty, new IntPtr(normalState)); BFS.Window.Minimize(window); } //set the script state to minimized SetScriptState(ScriptState.Minimized); } //this function quickly checks to see whether we need to restore previously minimized windows private static bool IsScriptInMinimizeState() { //read the setting value string state = BFS.ScriptSettings.ReadValue("Minimize and Restore Windows State"); //return the saved state. if no state saved, return false return (state.Length != 0) && (state.Equals("minimized")); } //this function saves the script state private static void SetScriptState(ScriptState state) { //save the state BFS.ScriptSettings.WriteValue("Minimize and Restore Windows State", (state == ScriptState.Normal) ? "normal" : "minimized"); } private static bool IsDisplayFusionWindowOrHiddenExplorerWindow(IntPtr window) { // Ignore any DisplayFusion windows (title bar buttons, etc.) // Ignore pesky hidden explorer.exe windows string windowClass = BFS.Window.GetClass(window); if((windowClass.StartsWith("DF", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("EdgeUiInputTopWndClass", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("EdgeUiInputWndClass", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("NativeHWNDHost", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("ModeInputWnd", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("MetroGhostWindow", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("ImmersiveLauncher", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("ApplicationManager_ImmersiveShellWindow", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("Shell_TrayWnd", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("WorkerW", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("Progman", StringComparison.OrdinalIgnoreCase)) || (windowClass.Equals("SearchPane", StringComparison.OrdinalIgnoreCase))) { return true; } return false; } }