在 PowerShell 中将控制台设置为 Top-Most
Set console Top-Most in PowerShell
因此,尽管有很多关于如何将 表单 设置为最顶层的建议,但我找不到任何使我的控制台 运行 最顶层的东西。
所以我的问题是:如何在脚本中让我的控制台 运行 最上面?
这需要一些 .NET 互操作,详见此博客:
Scripts From TechEd 2012… Part 1 (Keeping PowerShell Window On Top)
我已经复制了下面的相关代码以防链接站点消失:
$signature = @'
[DllImport("user32.dll")]
public static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags);
'@
$type = Add-Type -MemberDefinition $signature -Name SetWindowPosition -Namespace SetWindowPos -Using System.Text -PassThru
$handle = (Get-Process -id $Global:PID).MainWindowHandle
$alwaysOnTop = New-Object -TypeName System.IntPtr -ArgumentList (-1)
$type::SetWindowPos($handle, $alwaysOnTop, 0, 0, 0, 0, 0x0003)
编辑:
如评论中所述:如果您来自批处理文件,PowerShell 在子进程中运行并且不拥有控制台 window,因此您必须进行更改:
$signature = @'
[DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags);
'@
$type = Add-Type -MemberDefinition $signature -Name SetWindowPosition -Namespace SetWindowPos -Using System.Text -PassThru
$handle = $type::GetConsoleWindow()
$type::SetWindowPos($handle, -1, 0, 0, 0, 0, 0x0003)
因此,尽管有很多关于如何将 表单 设置为最顶层的建议,但我找不到任何使我的控制台 运行 最顶层的东西。
所以我的问题是:如何在脚本中让我的控制台 运行 最上面?
这需要一些 .NET 互操作,详见此博客:
Scripts From TechEd 2012… Part 1 (Keeping PowerShell Window On Top)
我已经复制了下面的相关代码以防链接站点消失:
$signature = @'
[DllImport("user32.dll")]
public static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags);
'@
$type = Add-Type -MemberDefinition $signature -Name SetWindowPosition -Namespace SetWindowPos -Using System.Text -PassThru
$handle = (Get-Process -id $Global:PID).MainWindowHandle
$alwaysOnTop = New-Object -TypeName System.IntPtr -ArgumentList (-1)
$type::SetWindowPos($handle, $alwaysOnTop, 0, 0, 0, 0, 0x0003)
编辑:
如评论中所述:如果您来自批处理文件,PowerShell 在子进程中运行并且不拥有控制台 window,因此您必须进行更改:
$signature = @'
[DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags);
'@
$type = Add-Type -MemberDefinition $signature -Name SetWindowPosition -Namespace SetWindowPos -Using System.Text -PassThru
$handle = $type::GetConsoleWindow()
$type::SetWindowPos($handle, -1, 0, 0, 0, 0, 0x0003)