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()) { //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); //focus the last focused window IntPtr lastWindow = GetLastFocusedWindow(); if(lastWindow != IntPtr.Zero) BFS.Window.Focus(lastWindow); //exit the script return; } //if we got to this point we should save all of the windows, then minimize them //set the last focused window SetLastFocusedWindow(BFS.Window.GetFocusedWindow()); //loop through all of the visiable windows, save their state, then minimize then foreach(IntPtr window in BFS.Window.GetVisibleWindowHandles()) { 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); } private static void SetLastFocusedWindow(IntPtr lastFocusedWindow) { BFS.ScriptSettings.WriteValue("Minimize and Restore Windows Last Focused Window", lastFocusedWindow.ToInt64().ToString()); } private static IntPtr GetLastFocusedWindow() { long window; if(Int64.TryParse(BFS.ScriptSettings.ReadValue("Minimize and Restore Windows Last Focused Window"), out window)) return new IntPtr(window); return IntPtr.Zero; } //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"); } }