如何在隐藏控制台的情况下运行C#控制台应用程序

Aar*_*mas 135 c# console-application

有没有办法在执行控制台应用程序时隐藏控制台窗口?

我目前正在使用Windows窗体应用程序来启动控制台进程,但我不希望在任务运行时显示控制台窗口.

Sim*_*mon 190

如果您编写了控制台应用程序,则可以将其隐藏起来.

创建一个新的控制台应用程序,然后将"输出类型"类型更改为"Windows应用程序"(在项目属性中完成)

  • 我试图隐藏自己的控制台,而不是调用其他东西然后隐藏它(就像接受的答案所假设的那样) - 所以这对我来说是最好的.谢谢! (6认同)
  • 谢谢哥们儿 !这也是我一直在寻找的! (6认同)
  • 接受的答案假设是因为它在问题中说明了. (3认同)

Ada*_*itz 151

如果您正在使用ProcessStartInfo该类,则可以将窗口样式设置为隐藏:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Hides GUI
start.CreateNoWindow = true; //Hides console
Run Code Online (Sandbox Code Playgroud)

  • 我不得不限制他的网络连接来打败他;) (70认同)
  • 神圣的废话 - 有人比乔快!=) (69认同)
  • 就是我要发布的内容:) (20认同)
  • 不隐藏控制台窗口,需要StartInfo.CreateNoWindow = true. (12认同)
  • 它不适用于调用命令行工具.使用yourprocess.StartInfo.CreateNoWindow = true; 相反,见下文. (11认同)
  • 这不会隐藏 **控制台** 应用程序的控制台窗口。[WindowStyle](https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.windowstyle.aspx) 属性仅适用于 GUI 应用程序。另一方面,[这个答案](http://stackoverflow.com/a/848343/1889329)确实隐藏了控制台窗口。120 票赞成(2 票反对)的答案根本不起作用?投票系统处于可悲的状态。 (2认同)

小智 67

如果您正在使用Process Class,那么您可以编写

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
Run Code Online (Sandbox Code Playgroud)

之前yourprocess.start();和过程将被隐藏

  • 接受的答案对我不起作用.这一个. (19认同)
  • 祝你好运,如果你必须尽早停止这个过程.Process.Kill突然终止.Process.CloseMainWindow失败.GenerateConsoleCtrlEvent无法向进程发送ctrl + c或ctrl + break.WM_CLOSE到进程中的所有线程窗口都失败了.似乎无法干净地结束使用这两个参数值启动的进程.请在此处查看我的问题:http://stackoverflow.com/questions/16139571/how-to-cleanly-shut-down-a-console-app-started-with-process-start (4认同)
  • @Triynko:你不能干净地终止任何进程,除非该进程积极合作。这不是旗帜或其他任何东西的问题。操作系统中没有任何内容可以触发彻底关闭。这里常见的解决方案是使用可等待的内核对象,当从属进程应该终止时,它会在控制进程中发出信号。从属进程需要主动监视此可等待对象的状态,并在收到信号后启动干净关闭。 (2认同)

小智 41

简单的答案是:转到控制台应用程序的属性(项目属性).在"应用程序"选项卡中,只需将"输出类型"更改为"Windows应用程序".就这样.

  • 靶心.这与创建不调用任何表单的Windows应用程序相同. (4认同)
  • 这是正确的答案。没有其他创可贴方法。这是真正的正确答案。您希望您的应用程序从一开始就不会打开控制台。此外,您希望能够随时打开表单。因此,您只需在需要时调用该表单即可。即当用户右键单击系统托盘图标并选择首选项时调用我们的表单。这是正确的答案! (2认同)

Tho*_*que 20

您可以使用FreeConsole API将控制台从进程中分离出来:

[DllImport("kernel32.dll")]
static extern bool FreeConsole();
Run Code Online (Sandbox Code Playgroud)

(当然,只有在您可以访问控制台应用程序的源代码时才适用)

  • 然后将项目编译为Windows应用程序,而不是控制台应用程序 (5认同)
  • 另外`[DllImport("kernel32.dll")] static extern bool AllocConsole();`允许你从标准的Win32应用程序轻松运行_with_一个控制台 (3认同)

JCH*_*H2k 7

如果您对输出感兴趣,可以使用此功能:

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}
Run Code Online (Sandbox Code Playgroud)

它运行给定的命令行程序,等待它完成并将输出作为字符串返回.