Processing Ajax...

Close Dialog


Close Dialog

Close Dialog

Change Desktop Icon Size

This script lets you choose the desktop icon size from a drop-down list.
Minimum Version
Created By
Thomas Malloch (BFS)
Date Created
May 2, 2016
Date Last Modified
May 2, 2016

Scripted Function (Macro) Code

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.InteropServices;

// The 'windowHandle' parameter will contain the window handle for the:
//   - Active window when run by hotkey
//   - Trigger target when run by a Trigger 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
	[DllImport("user32.dll", PreserveSig = true, SetLastError = false, CharSet = CharSet.Unicode)]
	private static extern IntPtr FindWindow(string lpClassName, IntPtr lpWindowName);

	[DllImport("user32.dll", PreserveSig = true, SetLastError = false, CharSet = CharSet.Unicode)]
	private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, IntPtr ZeroOnly);

	[DllImport("user32.dll", PreserveSig = true, SetLastError = false, CharSet = CharSet.Unicode)]
	private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, IntPtr lParam);

	[DllImport("user32.dll", PreserveSig = true, SetLastError = false)]
	[return: MarshalAs(UnmanagedType.Bool)]
	private static extern bool EnumWindows(EnumWindowCallback callPtr, IntPtr lParam);
	private delegate bool EnumWindowCallback(IntPtr hwnd, IntPtr lParam);
	private const uint WM_COMMAND = 0x0111;	
	public static void Run(IntPtr windowHandle)
		//create a dictionary to store the icon size messages and the names of the sizes
		Dictionary<string, uint> iconSizes = new Dictionary<string, uint>
			{"Small", 28752},
			{"Medium", 28750},
			{"Large", 28751}
		//try to get the shell window
		IntPtr shell = FindShellWindow();
		//if we couldn't find the shell window, exit the script
		if(shell == IntPtr.Zero)
		//ask the user what size they would like the icons
		string selection = BFS.Dialog.GetUserInputList("What size would you like the icons?", new List<string>(iconSizes.Keys).ToArray());
		//if the user cancelled, exit the script
		//send a message to the shell window with the user's selection
		SendMessage(shell, WM_COMMAND, iconSizes[selection], IntPtr.Zero);
	private static IntPtr FindShellWindow()
		//try to find the shell window. it's either a child of Progman, or tucked away in some WorkerW
		IntPtr progman = FindWindow("Progman", IntPtr.Zero);
		IntPtr shell = FindWindowEx(progman, IntPtr.Zero, "SHELLDLL_DefView", IntPtr.Zero);
		if(shell != IntPtr.Zero)
			return shell;
		//enumerate through the windows until we find a WorkerW with SHELLDLL_DefView as it's child
		EnumWindows(delegate(IntPtr hwnd, IntPtr lParam)
			//not a WorkerW
			if(!BFS.Window.GetClass(hwnd).Equals("WorkerW", StringComparison.OrdinalIgnoreCase))
				return true;
			//see if this WorkerW contains the shell window
			shell = FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", IntPtr.Zero);
			//if it doesn't continue enemerating
			if(shell == IntPtr.Zero)
				return true;
			//if we got this far, we found the shell window. stop enumerating.
			return false;
		}, IntPtr.Zero);
		return shell;