Processing Ajax...

Title

Message

Confirm

Confirm

Confirm

Confirm

Are you sure you want to delete this item?

Confirm

Are you sure you want to delete this item?

Confirm

Are you sure?

Minimize/Restore All Windows

Description
This script will minimize all open windows when run the first time, and will restore all open windows when run the second time.
Language
C#.net
Minimum Version
Created By
Thomas Malloch (BFS)
Contributors
-
Date Created
Jan 6, 2015
Date Last Modified
Sep 6, 2024

Scripted Function (Macro) Code

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;
	}
}