【问题标题】:Maximize window and bring it in front with powershell最大化窗口并使用powershell将其放在前面
【发布时间】:2022-02-24 16:28:10
【问题描述】:

有没有办法从 powershell 把一个窗口放在前面? 我试过这个来隐藏所有窗口(工作)并将powershell带回来(不工作)

[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
$shell = New-Object -ComObject “Shell.Application”
$shell.MinimizeAll()

$a = Get-Process | Where-Object {$_.Name -like "powershell"}
[Microsoft.VisualBasic.Interaction]::AppActivate($a.ID)

有什么建议吗?

【问题讨论】:

  • 如果我不使用 $shell.MinimizeAll() 最小化窗口
  • @ravikanth 看来你是对的,如果窗口没有最小化而不是代码工作。所以也许我需要更改我的问题标题。

标签: powershell


【解决方案1】:

PowerShell Community Extensions 有一个 cmdlet 可以帮助解决这个问题。你可以这样使用它:

Set-ForegroundWindow (Get-Process PowerShell).MainWindowHandle

Set-ForegroundWindow (Get-Process -id $pid).MainWindowHandle

要激活/显示一个窗口,试试这个(假设你使用的是 PowerShell 2.0):

$sig = '[DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);'
Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32
Stop-Process -Name Notepad -ea 0;Notepad.exe
$hwnd = @(Get-Process Notepad)[0].MainWindowHandle
# Minimize window
[Win32.NativeMethods]::ShowWindowAsync($hwnd, 2)
# Restore window
[Win32.NativeMethods]::ShowWindowAsync($hwnd, 4)
Stop-Process -Name Notepad

【讨论】:

  • 好像没有用 $shell.MinimizeAll() $shell = New-Object -ComObject "Shell.Application" $shell.MinimizeAll() Set-ForegroundWindow (Get-Process -id $pid).MainWindowHandle 没有效果
  • 谢谢基思。 ShowWindowAsync 是我的问题的解决方案,但我必须在 MinimizeAll() 和 ShowWindowAsync 之间放置一个“睡眠”。似乎 MinimizeAll() 是一个 asyc 任务,如果它有很多窗口可以最小化 ShowWindowAsync 会被快速调用。
  • 我遇到了 ShowWindowAsync 的问题,即使窗口已最大化并且据说已激活,它可能不是最顶层的窗口。因此,您可能想在之后使用 SwitchToThisWindow。 PInvoke 的定义是: [DllImport("user32.dll", SetLastError=true)] public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab)
  • 根据 ShowWindow 函数的文档,值 4 表示 SW_SHOWNOACTIVATE,而值 9 表示 SW_RESTORE,这是 OP 正在寻找的。​​span>
【解决方案2】:

这有点作弊,因为它使用的是 WScript,但下面的单行代码将窗口置于前台,而不需要任何外部 cmdlet 安装。

在下面的示例中,“记事本”是与窗口关联的进程名称。

归功于 JSanders 发布的 here 的 Idera 论坛:

(New-Object -ComObject WScript.Shell).AppActivate((get-process notepad).MainWindowTitle)

【讨论】:

  • 这对我来说只是返回“False”
  • 如果您的窗口被最小化为托盘项目,它将没有主窗口标题。
  • @Scott Dudley - 它不符合你对我的建议
【解决方案3】:

当我最后将 .MainWindowTitle 替换为 .Description 时,Wscript 一个衬里正在为我工​​作。所以这条线变成了:

(New-Object -ComObject WScript.Shell).AppActivate((get-process notepad).Description)

还没有找到一个类似的衬垫来最大化它......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多