3

我对批处理脚本有点陌生。我最近遇到了一个问题,关于如何在批处理文件运行时禁用 cmd 的关闭按钮。我看到了一些关于如何克服这个问题的帖子。但是事情表明我无法做到..如果any1可以为我指出正确的方向,那就太好了。如果 sum1 可以告诉我如何在批处理文件中执行我之前提到的操作,那将是非常可取的。所以当我在其他电脑上使用它时,效果仍然存在......

谢谢

4

3 回答 3

2

您可以创建一个可执行文件,为所有名为“cmd”的进程禁用 [X] 按钮,然后在批处理文件的第一行运行该可执行文件。

这是执行此操作的 ac# 程序:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Remove__X__Button_from_another_process
{

class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

    [DllImport("user32.dll")]
    static extern bool DeleteMenu(IntPtr hMenu, uint uPosition, uint uFlags);

    const uint SC_CLOSE = 0xF060;
    const uint MF_BYCOMMAND = 0x00000000;

    static void Main(string[] args)
    {
        //Console.Write("Please enter process name:"); // "cmd"
        //String process_name = Console.ReadLine();

        Process[] processes = Process.GetProcessesByName("cmd");
        foreach (Process p in processes)
        {
            IntPtr pFoundWindow = p.MainWindowHandle;

            IntPtr nSysMenu = GetSystemMenu(pFoundWindow, false);
            if (nSysMenu != IntPtr.Zero)
            {
                if (DeleteMenu(nSysMenu, SC_CLOSE, MF_BYCOMMAND))
                {

                }
            }
        }
        Environment.Exit(0);
    }
}
于 2017-03-02T19:06:17.823 回答
1

你不能。

您可以使用 VBScript 隐藏批处理文件的执行

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("yourbatchfile.bat"), 0, True

这会对用户隐藏它,但它不会阻止他们在任务管理器中杀死它。

你问的事情真的做不到。

于 2012-12-07T12:32:22.147 回答
0

name.ps1在批处理文件夹中创建文件

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

添加到批次

Powershell.exe -executionpolicy remotesigned -File name.ps1

来源

于 2022-01-12T18:05:14.013 回答