script/tools/public/Set-WindowState.ps1
Function Set-WindowState { [CmdletBinding(DefaultParameterSetName = 'InputObject', SupportsShouldProcess)] param( [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)] [System.Diagnostics.Process[]] $InputObject, [Parameter(Position = 1)] [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] [string] $State = 'SHOW' ) Begin { $WindowStates = @{ 'FORCEMINIMIZE' = 11 'HIDE' = 0 'MAXIMIZE' = 3 'MINIMIZE' = 6 'RESTORE' = 9 'SHOW' = 5 'SHOWDEFAULT' = 10 'SHOWMAXIMIZED' = 3 'SHOWMINIMIZED' = 2 'SHOWMINNOACTIVE' = 7 'SHOWNA' = 8 'SHOWNOACTIVATE' = 4 'SHOWNORMAL' = 1 } $Win32ShowWindowAsync = Add-Type -MemberDefinition @' [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); '@ -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru if (!$script:MainWindowHandles) { $script:MainWindowHandles = @{ } } } Process { foreach ($process in $InputObject) { if ($process.MainWindowHandle -eq 0) { if ($script:MainWindowHandles.ContainsKey($process.Id)) { $handle = $script:MainWindowHandles[$process.Id] } else { Write-Error "Main Window handle is '0'" continue } } else { $handle = $process.MainWindowHandle $script:MainWindowHandles[$process.Id] = $handle } if ($PSCmdlet.ShouldProcess($process.Name, "ShowWindow($handle, $State)")) { $Win32ShowWindowAsync::ShowWindowAsync($handle, $WindowStates[$State]) | Out-Null Write-Verbose ("Set Window State '{1} on '{0}'" -f $MainWindowHandle, $State) } } } } |