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