Tenho um script Pwsh com um menu que executa diversas operações diferentes para me ajudar no dia a dia.
Para uma das operações, eu inicio um processo com Start-Process, exceto que ele focaliza a janela iniciada, mas para facilitar eu gostaria que o script fosse focalizado novamente após o lançamento e não o processo iniciado.
Não quero usar os argumentos “PassThru” ou “NoNewWindow” porque não quero que o processo iniciado seja iniciado no script, nem “WindowStyle” com Minimized porque isso focaliza o processo iniciado de qualquer maneira, nem Hidden porque ainda preciso ver a janela do processo em algum lugar.
Eu tentei esse método que parece funcionar melhor:
Start-Process -FilePath "MyProcessPath"
Start-Sleep -Seconds 1
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class WinAp {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
"@
$p = Get-Process | Where-Object { $_.MainWindowTitle -like "*ScriptTitle*" -and $_.ProcessName -eq "powershell" }
$h = $p.MainWindowHandle
[void] [WinAp]::SetForegroundWindow($h)
[void] [WinAp]::ShowWindow($h, 1)
Mas, infelizmente, não funciona. Parece que faz alguma coisa na janela, pois ela pisca na barra de tarefas, mas não foca. Parece que, embora o script seja executado como administrador, ele não funciona para focar uma janela de administrador como essa?
Entretanto, para outra parte do meu script, fiz isso:
$tempPath = [System.IO.Path]::GetTempFileName().Replace(".tmp", ".vbs")
$code = @'
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate "App.exe"
WScript.Sleep 250
WshShell.SendKeys "{ENTER}"
'@
$code | Out-File $tempPath -Encoding ASCII
Start-Process "wscript.exe" $tempPath -Wait
Remove-Item $tempPath
E funciona bem... ele foca a janela e, em seguida, pressiona a tecla solicitada (embora essa parte não seja necessária no meu problema atual). Tentei com o meu script, mas... nada. Principalmente porque o aplicativo é iniciado com o script, então como administrador também, eu acho? Então, não entendo por que funciona, mas não para o script em si.
Obrigado!