【问题标题】:Hide Command Window in C# Application在 C# 应用程序中隐藏命令窗口
【发布时间】:2010-08-09 12:47:09
【问题描述】:

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

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

  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;
    }
}

【问题讨论】:

  • 你能把剩下的Process/ProcessStartInfo代码贴出来吗?
  • @fletcher:问题中指出输出类型是 Windows 应用程序而不是控制台。我已经使用设置为 Windows 应用程序的输出类型对其进行了测试,它工作正常。 @snow:我会仔细检查你的 OutputType 设置。
  • @fletcher 这实际上是个问题!我希望窗口根本不显示!
  • 我开始认为这是 XCOPY 特有的错误...有人有这方面的经验吗?
  • 啊,我的错。我错过了 WinForms 部分

标签: c# .net command-prompt xcopy


【解决方案1】:

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

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

xcopy.exe 中有一个特定的怪癖可能会让您失望。如果您不重定向输入,它会 not 执行。它只是在没有诊断的情况下无法运行。

【讨论】:

  • /B 用于 xcopy 命令,这可能就是我们需要诚实的全部。
【解决方案2】:

我看到您正在调用 cmd,然后将命令作为参数传递。而是直接调用命令

例如

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

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

【讨论】:

  • 我可能应该在问题中说明这一点,但是客户端会将他想要的任何命令行命令传递给我的程序,所以我无法对 xcopy 进行硬编码,但仍然代表你!
  • @Snow,你照他说的还是可以的,ProcessStartInfo procStartInfo = new ProcessStartInfo(Arg[0], String.Join(" ", Arg.Skip(1).ToArray());
  • @snow xcopy 只是举例
【解决方案3】:

你可以试试添加

process.StartInfo.UseShellExecute = false; 

到你的过程

【讨论】:

  • 只是为了澄清答案。你需要process.StartInfo.UseShellExecute = false;process.StartInfo.CreateNoWindow = false;。这两个一起将隐藏进程窗口
  • @Rémi:你需要process.StartInfo.CreateNoWindow = true;
  • 我收到错误“系统找不到指定的文件。”即使我已将自定义命令添加到系统 PATH 变量中也是如此。
【解决方案4】:

我有一个类似的任务 - 可以通过 API 调用在创建后隐藏窗口。 (在您的情况下,您可能需要一个辅助线程。)

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

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

ShowWindow(hWnd, 0);

0 隐藏窗口,1 显示窗口

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

pinvoke.net enumwindows(user32)

【讨论】:

    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多