在 C# 应用程序中隐藏命令窗口

问题描述 投票:0回答:6

在你说这是一个重复的问题之前,请让我解释一下(因为我已经阅读了所有类似的帖子)。

我的应用程序具有这两种设置:

  procStartInfo.CreateNoWindow = true;
  procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

并且还有 WindowsApplication 作为输出类型。

当我调用命令行命令时,黑色窗口仍然出现。 我还能做些什么来隐藏窗口吗? 并非所有命令都会发生这种情况,XCOPY 是黑色窗口确实闪烁的情况。 只有当我进行 XCOPY 的目标也已包含该文件并且它会提示我是否要替换它时,才会发生这种情况。 即使我传入/Y它仍然会短暂闪烁。

如果有帮助的话,我愿意使用 vbscript,但是还有其他想法吗?

客户端将调用我的可执行文件,然后传入命令行命令即:

C:\MyProgram.exe start XCOPY c:\Test.txt c:\ProgramFiles\

这是应用程序的完整代码:

class Program
{
    static void Main(string[] args)
    {      
            string command = GetCommandLineArugments(args);

            // /c tells cmd that we want it to execute the command that follows and then exit.
            System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command);

            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;

            // Do not create the black window.
            procStartInfo.CreateNoWindow = true;
            procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo = procStartInfo;
            process.Start();

        }

    private static string GetCommandLineArugments(string[] args)
    {
        string retVal = string.Empty;

        foreach (string arg in args)
            retVal += " " + arg;


        return retVal;
    }
}
c# .net command-prompt xcopy
6个回答
9
投票

问题是您正在使用cmd.exe。 只有 its 控制台窗口将被隐藏,而不是您要求其启动的进程的控制台窗口。 使用 cmd.exe 没有什么意义,除非您试图执行它本身实现的一些命令。 喜欢复制。

如果您需要 cmd.exe,您仍然可以抑制窗口,您必须使用 /B 选项来启动。 输入开始/?在命令提示符下查看选项。 并不是说它有帮助,你不能使用 START COPY。

xcopy.exe 中有一个特定的怪癖,可能也会让您感到困惑。 如果您不重定向输入,它不会执行。 如果没有诊断它就无法运行。


5
投票
cmd

,然后将命令作为参数传递。而是直接调用命令 例如

System.Diagnostics.ProcessStartInfo procStartInfo = new System.DiagnosticsProcessStartInfo("xcopy", "<sourcedir> <destdir> <other parameters>"); procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;



4
投票

process.StartInfo.UseShellExecute = false;

您的流程


1
投票
cmd.exe

并通过标准

input.WriteLine
将命令传递给它,并且您不希望每次运行代码时都弹出 CMD 窗口,您可以简单地编写以下命令:
 test.StartInfo.FileName = "cmd.exe";
 test.StartInfo.CreateNoWindow = true;

通过将 
create no window

设置为 false,我们将在后台运行发送到 CMD 的命令,并且不会向用户显示输出。通过将其设置为 false,会弹出 CMD 窗口。


0
投票

[DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

如果你知道新窗口的句柄,你可以调用

ShowWindow(hWnd, 0);

0 隐藏窗口,1 显示窗口

要获取窗口的句柄,请查看:

pinvoke.net enumwindows(user32)


0
投票

Process process = new Process(); process.StartInfo.FileName = "CMD.exe"; // Your command for executing process.StartInfo.Arguments = $""; // Hide cmd window process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.Start(); // If needed, wait for exit process.WaitForExit();

	
© www.soinside.com 2019 - 2024. All rights reserved.