3

在 Powershell 环境中,是否可以隐藏标题栏或至少删除关闭按钮?

我有一些脚本,我希望用户在运行时不要“戳”它们。我考虑过以隐藏的方式运行脚本,但是当事情实际上仍在幕后进行时,系统看起来就像卡住了一分钟或完全完成。

4

3 回答 3

3

您可以在 poshcode.org使用此脚本禁用 Windows 控制台的关闭按钮。但是,用户仍然可以从任务栏关闭控制台,并且它不适用于 ConEmu 等控制台替代品。

$code = @'
using System;
using System.Runtime.InteropServices;

namespace CloseButtonToggle {

 internal static class WinAPI {
   [DllImport("kernel32.dll")]
   internal static extern IntPtr GetConsoleWindow();

   [DllImport("user32.dll")]
   [return: MarshalAs(UnmanagedType.Bool)]
   internal static extern bool DeleteMenu(IntPtr hMenu,
                          uint uPosition, uint uFlags);

   [DllImport("user32.dll")]
   [return: MarshalAs(UnmanagedType.Bool)]
   internal static extern bool DrawMenuBar(IntPtr hWnd);

   [DllImport("user32.dll")]
   internal static extern IntPtr GetSystemMenu(IntPtr hWnd,
              [MarshalAs(UnmanagedType.Bool)]bool bRevert);

   const uint SC_CLOSE     = 0xf060;
   const uint MF_BYCOMMAND = 0;

   internal static void ChangeCurrentState(bool state) {
     IntPtr hMenu = GetSystemMenu(GetConsoleWindow(), state);
     DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
     DrawMenuBar(GetConsoleWindow());
   }
 }

 public static class Status {
   public static void Disable() {
     WinAPI.ChangeCurrentState(false); //its 'true' if need to enable
   }
 }
}
'@

Add-Type $code
[CloseButtonToggle.Status]::Disable()
于 2013-10-28T19:20:17.597 回答
2

想到的唯一选择是隐藏正在运行脚本的窗口,然后将其添加到您的脚本中:

start-process powershell.exe -ArgumentList '-noprofile -command "&{get-content c:\temp\log.txt -Wait}"'

并将您的脚本输出重定向到该文件。他们将能够在该窗口中看到脚本输出,但他们在该窗口中所做的任何事情都不会对脚本产生任何影响。在脚本结束时,删除日志文件,日志窗口将关闭。

于 2013-10-28T19:12:55.837 回答
2

您可以在 PowerShell 中使用 Windows 窗体,并隐藏控制框:

[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    $form = New-Object Windows.Forms.Form
    $form.ControlBox = $false
    $form.Text = "Test Form"
    $Button = New-Object Windows.Forms.Button

看起来像:

在此处输入图像描述

于 2013-10-28T19:23:31.913 回答