在PowerShell中将控制台设置为最顶层

5

虽然有很多关于如何将表单置于最上方的建议,但我没找到任何可以使我的控制台置于最上方的内容。

所以我的问题是:在脚本执行期间,如何使我的控制台置于最前?


看看这个问题和我的答案,你可以修改它来实现置顶。 https://dev59.com/4lgQ5IYBdhLWcg3wkEtJ - Kory Gill
很不幸,我无法以管理员身份运行... :/ - Omglolyes
1个回答

5
这需要进行一些.NET互操作,详见此博客: TechEd 2012脚本...第1部分(使PowerShell窗口保持在顶部) 如果链接失效,我已经复制了相关代码如下:
$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在子进程中运行并不拥有控制台窗口,因此您需要进行更改:

$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)

1
@Omglolyes:你可以用$type::SetWindowPos($handle, -1, 0, 0, 0, 0, 0x0003)替换$type::SetWindowPos($handle, $alwaysOnTop, 0, 0, 0, 0, 0x0003) - mklement0
2
@boxdog,你的脚本中有花引号,这在Powershell中支持不好 - Rich Moss
1
@Omglolyes:如果你是从批处理文件中运行的,PowerShell会在子进程中运行,并且不拥有控制台窗口,因此你需要进行更改:将[DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow();添加到$signature的值中,将$handle = ...这一行替换为$handle = $type::GetConsoleWindow() - mklement0
1
@RichMoss:最好避免使用非ASCII范围的引号,但请注意PowerShell本身完全支持它们。问题通常是“字符编码”的问题-请参见此答案 - mklement0
1
@RichMoss。正如我在帖子中所说的,这段文字是我从博客上直接复制粘贴过来的,所以引号的奇怪出现也是由此而来。尽管如此,我应该检查一下它,而不是仅仅假设它没问题。现在已经修复了。 - boxdog
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接