用 PowerShell 指定窗口的位置和大小
我想尝试通过命令来指定应用程序窗口的位置和大小,所以我试了一下。
本次参考了以下代码进行实现。请参考代码部分的节。
-
win7 powershell script to automatically resize a minecraft window for 1280×720 HD fraps recording. · GitHub
尝试使用
获取位置和尺寸
你可以使用Get-WindowRect命令获取左上角的位置和大小。
PS> Get-WindowRect * | ft
Name X Y Width Height
---- - - ----- ------
EXCEL 650 92 702 525
powershell 38 131 589 615

指定位置和大小
可以使用Move-WindowRect指定窗口的左上位置和大小,如下所示。
PS> Move-WindowRect powershell 650 92 702 525
PS> Move-WindowRect Excel 38 131 589 615
PS> Get-WindowRect * | ft
Name X Y Width Height
---- - - ----- ------
EXCEL 38 131 589 615
powershell 650 92 702 525

保存和恢复位置和大小
通过Export-WindowRect命令,将每个窗口的当前位置和大小导出到csv文件中,然后可以使用Import-WindowRect命令读取该文件,从而恢复每个窗口的位置和大小。
PS> Export-WindowRect .\wr.csv
PS> cat .\wr.csv
"Name,"X","Y","Width","Height"
"EXCEL,"38","131","589","615"
"powershell,"650","92","702","525"
PS>
PS> # 適当にウィンドウを動かして、大きさを変える
PS>
PS> Import-WindowRect .\wr.csv
代码
filter Import-WindowRect ($Path)
{Import-Csv $Path | %{Move-WindowRect $_.Name $_.X $_.Y $_.Width $_.Height}}
filter Export-WindowRect ($Path)
{Get-Process -Name * | %{Get-WindowRect $_.Name} | Export-Csv $Path -Encoding UTF8 -NoTypeInformation}
filter Move-WindowRect
{
Param
(
[String]$Name,
[Int]$X = 0,
[Int]$Y = 0,
[Int]$Width = 400,
[Int]$Height = 300
)
Get-Process -Name $Name | ?{$_.MainWindowTitle -ne ""} | %{
[Win32]::MoveWindow($_.MainWindowHandle, $X, $Y, $Width, $Height, $true)
} | Out-Null
}
filter Get-WindowRect ([String]$Name)
{
Get-Process -Name $Name | ?{$_.MainWindowTitle -ne ""} | %{
$rc = New-Object RECT
[Win32]::GetWindowRect($_.MainWindowHandle, [ref]$rc) | Out-Null
ConvertTo-Rect2 $_.Name $rc
}
}
# Helper
# ------
filter ConvertTo-Rect2 ($name, $rc)
{
$rc2 = New-Object RECT2
$rc2.Name = $name
$rc2.X = $rc.Left
$rc2.Y = $rc.Top
$rc2.Width = $rc.Right - $rc.Left
$rc2.Height = $rc.Bottom - $rc.Top
$rc2
}
# C#
# --
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
}
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
public struct RECT2
{
public string Name;
public int X;
public int Y;
public int Width;
public int Height;
}
"@