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)
return;
//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
if(string.IsNullOrEmpty(selection))
return;
//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;
}
}