I'm trying to restore an application window from a minimized state, except in my case it's an Oracle VirtualBox VM window running alongside multiple VMs. They all have the same process name which means I can't restore by process name which would be easy. I need to restore by mainWindowtitle which is the unique property. Though I have a PowerShell script I've been tinkering with, it's just exiting with no error message. While no error message is logged when the script runs, something just appears to flash for a millisecond, but then nothing happens afterwards - all windows remain minimized. The window title I want to restore contains DC2. The full title of the window is: DC2 [Running] - Oracle VM VirtualBox. Neither using the full window title name nor a partial name work. The PowerShell script:
Clear-Host
Function Set-WindowStyle
{
param
(
[Parameter()]
[ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE',
'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED',
'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')]
$Style = 'SHOW',
[Parameter()]
$MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle
)
$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
}
Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style]))
$Win32ShowWindowAsync = Add-Type –memberDefinition @”
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru
$Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null
}
# Usage
# Minimize a running process window
#Get-Process -Name Taskmgr | %{Set-WindowStyle MINIMIZE $PSItem.MainWindowHandle}
#Get-Process -Name DC2* | %{Set-WindowStyle MINIMIZE $PSItem.MainWindowHandle}
# Restore a running process window - the last window called will be topmost
#Get-Process -Name DC2 | %{Set-WindowStyle RESTORE $PSItem.MainWindowHandle}
#Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle -AutoSize
Get-Process | Where-Object {$_.MainWindowTitle -Contains "DC2"} | %{Set-WindowStyle RESTORE $PSItem.MainWindowHandle}
Here are all my window titles:
PS C:\Users\Admin1> Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle -AutoSize
Id Name MainWindowTitle
-- ---- ---------------
9668 powershell_ise Windows PowerShell ISE
5152 ServerManager Server Manager
2504 VirtualBoxVM CentOS2 [Running] - Oracle VM VirtualBox
4468 VirtualBoxVM WIN10 [Running] - Oracle VM VirtualBox
8812 VirtualBoxVM DC2 [Running] - Oracle VM VirtualBox
9028 VirtualBoxVM MGMT1 [Running] - Oracle VM VirtualBox
10252 VirtualBoxVM CentOS1 [Running] - Oracle VM VirtualBox
10752 VirtualBoxVM ADFS1 [Running] - Oracle VM VirtualBox