PowerShell:恢复VirtualBox虚拟机窗口,并通过mainWindowtitle将其带到前面



我正试图从最小化状态恢复应用程序窗口,除非在我的情况下,它是一个Oracle VirtualBox VM窗口与多个VM一起运行。它们都有相同的进程名,这意味着我不能通过进程名恢复,这很容易。我需要通过mainWindowtitle恢复,这是唯一的属性。虽然我有一个PowerShell脚本,我一直在修补,它只是退出没有错误消息。虽然在脚本运行时没有记录任何错误消息,但似乎只有一毫秒的闪烁,但之后什么也没有发生-所有窗口都保持最小化。我要恢复的窗口标题包含DC2. 该窗口的完整标题为:DC2 [Running] - Oracle VM VirtualBox. 使用完整的窗口标题名和部分名称都不起作用。PowerShell脚本:

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}

这是我所有的窗口标题:

PS C:UsersAdmin1> 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                  

[这个答案][1]成功了:

Add-Type -AssemblyName UIAutomationClient
$MyProcess = Get-Process | where { $_.MainWindowTitle -like "DC2*" }
if ($null -ne $MyProcess) { 
# if Minimized make it Normal
$ae = [System.Windows.Automation.AutomationElement]::FromHandle($MyProcess.MainWindowHandle)
$wp = $ae.GetCurrentPattern([System.Windows.Automation.WindowPatternIdentifiers]::Pattern)
if ($wp.Current.WindowVisualState -eq 'Minimized') {
$wp.SetWindowVisualState('Normal') 
}
# execute needed function
}
else {
start-process "C:Program Files (x86)TestccTest.exe" -WindowStyle Normal
# execute needed function
}

[1]: https://stackoverflow.com/questions/70629307/with-powershell-how-to-switch-minimized-application-to-normal-state?rq=1

最新更新