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

时间:2009-05-07 19:03:15

标签: c# console-application

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

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

13 个答案:

答案 0 :(得分:186)

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

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

答案 1 :(得分:149)

如果您使用的是ProcessStartInfo课程,则可以将窗口样式设置为隐藏:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

答案 2 :(得分:66)

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

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

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

答案 3 :(得分:41)

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

答案 4 :(得分:19)

您可以使用FreeConsole API将控制台与进程分离:

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

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

答案 5 :(得分: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();
}

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

答案 6 :(得分:4)

如果您正在创建一个不需要用户输入的程序,您可以随时将其创建为服务。服务不会显示任何类型的用户界面。

答案 7 :(得分:1)

我知道我没有回答你想要的是什么,但我想知道你是否提出了正确的问题。

为什么不使用:

  1. Windows服务
  2. 创建一个新线程并在该
  3. 上运行您的流程

    如果你想要的只是运行一个过程,这听起来就像是更好的选择。

答案 8 :(得分:1)

将此添加到您的类以导入DLL文件:

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

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

然后如果你想隐藏它,请使用以下命令:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);

如果你想要显示控制台:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);

答案 9 :(得分:1)

基于Adam Markowitz的上述答案,以下为我工作:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();

答案 10 :(得分:1)

我有一个通用的解决方案可供分享:

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing
{
    class Magician
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

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

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        {
            ShowWindow(GetConsoleWindow(), HIDE);
        }
    }
}

只需在您的项目中包含此类,然后调用Magician.DisappearConsole();

通过单击启动程序时,控制台将闪烁。从命令提示符处执行时,命令提示符在执行后不久消失。

我这样做是为了让Discord Bot作为不可见的进程在计算机的后台永久运行。这比让TopShelf为我工作要容易得多。在我在其他地方找到的代码的帮助下编写此代码之前,有几次TopShelf教程使我失败了。 ; P

我还尝试过简单地更改Visual Studio>项目>属性>应用程序中的设置以作为Windows应用程序而不是控制台应用程序启动,并且我的项目中的某些内容阻止了它隐藏我的控制台-也许是因为DSharpPlus要求启动一个启动时控制台。我不知道。不管是什么原因,此类都可以让我在弹出控制台后轻松终止控制台。

希望这位魔术师可以帮助别人。 ;)

答案 11 :(得分:0)

虽然这里的其他答案已经说过您可以将“输出类型”更改为“Windows应用程序”,但请注意,这将意味着您无法使用Console.In,因为它将成为NullStreamReader。

Console.OutConsole.Error似乎仍然正常。

答案 12 :(得分:0)

只需写下

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

psi.CreateNoWindow = true;