控制台的 PowerShell 控件最大化/恢复 window
PowerShell control maximise / restore for console window
我有这些方便的功能可以从命令行翻转控制台大小。唯一的问题是,如果控制台 window 处于最大化状态,它们将不起作用。有没有办法在 PowerShell 提示符下为控制台 window 切换最大化/恢复?
function Global:Set-ConsolePosition ($x, $y, $w, $h) {
# Keep this function in ProfileExtensions as used during updates
# Note: the DLL code below must not be indented from the left-side or will break
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int W, int H); '
# Do the Add-Type outside of the function as repeating it in a session can cause errors
$consoleHWND = [Console.Window]::GetConsoleWindow();
$consoleHWND = [Console.Window]::MoveWindow($consoleHWND, $x, $y, $w, $h);
# $consoleHWND = [Console.Window]::MoveWindow($consoleHWND,75,0,600,600);
# $consoleHWND = [Console.Window]::MoveWindow($consoleHWND,-6,0,600,600);
}
# Does not "maximize" but sets the window to the maximum extent allowed by the screensize.
function Global:Set-MaxWindowSize {
# Keep this function in ProfileExtensions as used during updates
# This will open every new console pinned to top of screen and large size
# Added new restriction for ultrawide screens to cap the width to 175
# https://gallery.technet.microsoft.com/scriptcenter/Set-the-PowerShell-Console-bd8b2ad1
#
# "Also note 'Mode 300' and 'Alt-Enter' to fullscreen the console`n"
if ($Host.Name -match "console") {
$MaxHeight = $host.UI.RawUI.MaxPhysicalWindowSize.Height - 5 # 1
$MaxWidth = $host.UI.RawUI.MaxPhysicalWindowSize.Width - 15 # 15
if ($MaxWidth -gt 175) { $MaxWidth = 175}
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyWindow.Height = ($MaxHeight)
$MyWindow.Width = ($MaxWidth-2)
$MyBuffer.Height = (9999)
$MyBuffer.Width = ($MaxWidth-2)
# $host.UI.RawUI.set_bufferSize($MyBuffer)
# $host.UI.RawUI.set_windowSize($MyWindow)
$host.UI.RawUI.BufferSize = $MyBuffer
$host.UI.RawUI.WindowSize = $MyWindow
}
}
# Set the window to be half-screen, left side
function lll {
Add-Type -AssemblyName System.Windows.Forms
$Screen = [System.Windows.Forms.Screen]::PrimaryScreen
$width = $Screen.WorkingArea.Width # .WorkingArea ignores the taskbar, .Bounds is whole screen
$height = $Screen.WorkingArea.Height
$w = $width/2 + 13
$h = $height + 8
$x = -7
$y = 0
Set-ConsolePosition $x $y $w $h
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyBuffer.Height = 9999
"`nWindowSize $($MyWindow.Width)x$($MyWindow.Height) (Buffer $($MyBuffer.Width)x$($MyBuffer.Height))"
"Position : Left:$x Top:$y Width:$w Height:$h`n"
}
# Set the window to be half-screen, right side
function rrr {
Add-Type -AssemblyName System.Windows.Forms
$Screen = [System.Windows.Forms.Screen]::PrimaryScreen
$width = $Screen.WorkingArea.Width # .WorkingArea ignores the taskbar, .Bounds is whole screen
$height = $Screen.WorkingArea.Height
$w = $width/2 + 13
$h = $height + 8
$x = $w - 20
$y = 0
Set-ConsolePosition $x $y $w $h
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyBuffer.Height = 9999
"`nWindowSize $($MyWindow.Width)x$($MyWindow.Height) (Buffer $($MyBuffer.Width)x$($MyBuffer.Height))"
"Position : Left:$x Top:$y Width:$w Height:$h`n"
}
# Set the window to be full-size
function fff {
Set-ConsolePosition -7 0 600 600
if ($Host.Name -match "console") {
$MaxHeight = $host.UI.RawUI.MaxPhysicalWindowSize.Height - 1
$MaxWidth = $host.UI.RawUI.MaxPhysicalWindowSize.Width
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyWindow.Height = $MaxHeight
$MyWindow.Width = $Maxwidth
$MyBuffer.Height = 9999
$MyBuffer.Width = $Maxwidth
# $host.UI.RawUI.set_bufferSize($MyBuffer)
# $host.UI.RawUI.set_windowSize($MyWindow)
$host.UI.RawUI.BufferSize = $MyBuffer
$host.UI.RawUI.WindowSize = $MyWindow
"`nWindowSize $($MyWindow.Width)x$($MyWindow.Height) (Buffer $($MyBuffer.Width)x$($MyBuffer.Height))`n"
}
}
# Only run this the first time that Profile Extensions are run in this session (i.e. so that ". pect" will not reactivate this)
if ($null -eq $ProfileExtensionsFirstRun) {
Set-ConsolePosition 75 0 600 600
Set-MaxWindowSize
}
我在网上找到了一个脚本并对其进行了调整以将当前 window 设置为正常 - 将其放在脚本顶部附近
$Script:showWindowAsync = Add-Type -MemberDefinition @"
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@ -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru
Function Set-WindowNormal()
{
$null = $showWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 1)
}
现在调用 Set-WindowNormal
应该将自身 window 设置为正常。把这个放在你想要规范化你的 window 的地方。 (最有可能在必要的函数调用之前)
我真的找不到更好的答案了。
在上面的代码中。有几种方法可以显示 window。 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow 解释它们。 1 是正常的。 2 被最小化等等...
这是我能够找到的答案。显然这是一个棘手的问题。
我有这些方便的功能可以从命令行翻转控制台大小。唯一的问题是,如果控制台 window 处于最大化状态,它们将不起作用。有没有办法在 PowerShell 提示符下为控制台 window 切换最大化/恢复?
function Global:Set-ConsolePosition ($x, $y, $w, $h) {
# Keep this function in ProfileExtensions as used during updates
# Note: the DLL code below must not be indented from the left-side or will break
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int W, int H); '
# Do the Add-Type outside of the function as repeating it in a session can cause errors
$consoleHWND = [Console.Window]::GetConsoleWindow();
$consoleHWND = [Console.Window]::MoveWindow($consoleHWND, $x, $y, $w, $h);
# $consoleHWND = [Console.Window]::MoveWindow($consoleHWND,75,0,600,600);
# $consoleHWND = [Console.Window]::MoveWindow($consoleHWND,-6,0,600,600);
}
# Does not "maximize" but sets the window to the maximum extent allowed by the screensize.
function Global:Set-MaxWindowSize {
# Keep this function in ProfileExtensions as used during updates
# This will open every new console pinned to top of screen and large size
# Added new restriction for ultrawide screens to cap the width to 175
# https://gallery.technet.microsoft.com/scriptcenter/Set-the-PowerShell-Console-bd8b2ad1
#
# "Also note 'Mode 300' and 'Alt-Enter' to fullscreen the console`n"
if ($Host.Name -match "console") {
$MaxHeight = $host.UI.RawUI.MaxPhysicalWindowSize.Height - 5 # 1
$MaxWidth = $host.UI.RawUI.MaxPhysicalWindowSize.Width - 15 # 15
if ($MaxWidth -gt 175) { $MaxWidth = 175}
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyWindow.Height = ($MaxHeight)
$MyWindow.Width = ($MaxWidth-2)
$MyBuffer.Height = (9999)
$MyBuffer.Width = ($MaxWidth-2)
# $host.UI.RawUI.set_bufferSize($MyBuffer)
# $host.UI.RawUI.set_windowSize($MyWindow)
$host.UI.RawUI.BufferSize = $MyBuffer
$host.UI.RawUI.WindowSize = $MyWindow
}
}
# Set the window to be half-screen, left side
function lll {
Add-Type -AssemblyName System.Windows.Forms
$Screen = [System.Windows.Forms.Screen]::PrimaryScreen
$width = $Screen.WorkingArea.Width # .WorkingArea ignores the taskbar, .Bounds is whole screen
$height = $Screen.WorkingArea.Height
$w = $width/2 + 13
$h = $height + 8
$x = -7
$y = 0
Set-ConsolePosition $x $y $w $h
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyBuffer.Height = 9999
"`nWindowSize $($MyWindow.Width)x$($MyWindow.Height) (Buffer $($MyBuffer.Width)x$($MyBuffer.Height))"
"Position : Left:$x Top:$y Width:$w Height:$h`n"
}
# Set the window to be half-screen, right side
function rrr {
Add-Type -AssemblyName System.Windows.Forms
$Screen = [System.Windows.Forms.Screen]::PrimaryScreen
$width = $Screen.WorkingArea.Width # .WorkingArea ignores the taskbar, .Bounds is whole screen
$height = $Screen.WorkingArea.Height
$w = $width/2 + 13
$h = $height + 8
$x = $w - 20
$y = 0
Set-ConsolePosition $x $y $w $h
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyBuffer.Height = 9999
"`nWindowSize $($MyWindow.Width)x$($MyWindow.Height) (Buffer $($MyBuffer.Width)x$($MyBuffer.Height))"
"Position : Left:$x Top:$y Width:$w Height:$h`n"
}
# Set the window to be full-size
function fff {
Set-ConsolePosition -7 0 600 600
if ($Host.Name -match "console") {
$MaxHeight = $host.UI.RawUI.MaxPhysicalWindowSize.Height - 1
$MaxWidth = $host.UI.RawUI.MaxPhysicalWindowSize.Width
$MyBuffer = $Host.UI.RawUI.BufferSize
$MyWindow = $Host.UI.RawUI.WindowSize
$MyWindow.Height = $MaxHeight
$MyWindow.Width = $Maxwidth
$MyBuffer.Height = 9999
$MyBuffer.Width = $Maxwidth
# $host.UI.RawUI.set_bufferSize($MyBuffer)
# $host.UI.RawUI.set_windowSize($MyWindow)
$host.UI.RawUI.BufferSize = $MyBuffer
$host.UI.RawUI.WindowSize = $MyWindow
"`nWindowSize $($MyWindow.Width)x$($MyWindow.Height) (Buffer $($MyBuffer.Width)x$($MyBuffer.Height))`n"
}
}
# Only run this the first time that Profile Extensions are run in this session (i.e. so that ". pect" will not reactivate this)
if ($null -eq $ProfileExtensionsFirstRun) {
Set-ConsolePosition 75 0 600 600
Set-MaxWindowSize
}
我在网上找到了一个脚本并对其进行了调整以将当前 window 设置为正常 - 将其放在脚本顶部附近
$Script:showWindowAsync = Add-Type -MemberDefinition @"
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@ -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru
Function Set-WindowNormal()
{
$null = $showWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 1)
}
现在调用 Set-WindowNormal
应该将自身 window 设置为正常。把这个放在你想要规范化你的 window 的地方。 (最有可能在必要的函数调用之前)
我真的找不到更好的答案了。
在上面的代码中。有几种方法可以显示 window。 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow 解释它们。 1 是正常的。 2 被最小化等等...
这是我能够找到的答案。显然这是一个棘手的问题。