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

How to run a C# console application with the console hidden

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

我正在使用的Windows窗体应用程序启动过程一控制台,但我不想显示在控制台窗口的任务是运行。


如果编写了控制台应用程序,则可以在默认情况下将其隐藏。

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


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

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


如果您使用的是流程类,那么您可以编写

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

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


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


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

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

(当然,这只适用于您有权访问控制台应用程序的源代码的情况)


如果您对输出感兴趣,可以使用以下函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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();
}

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


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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();

当您通过点击启动程序时,控制台将闪烁。从命令提示符执行时,命令提示符在执行后很快消失。

我这样做是为了一个不和谐的机器人,它作为一个不可见的过程永远在我的计算机的背景下运行。为我工作比让托普希夫容易。在我在其他地方找到的代码的帮助下写这篇文章之前,有几个Topshelf教程让我失败了。P

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

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


根据上面亚当·马尔科维茨的回答,以下是我的工作:

1
2
3
4
5
6
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();

将此添加到类以导入dll文件:

1
2
3
4
5
[DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

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

如果要隐藏它,请使用以下命令:

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

如果您想显示控制台:

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


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

你为什么不使用:

  • 视窗服务
  • 创建一个新线程并在此基础上运行您的进程
  • 如果你只想运行一个进程,这些听起来像是更好的选择。


    只写

    1
    2
    3
    4
    ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
    ......

    psi.CreateNoWindow = true;

    尽管这里的其他答案已经说过,您可以将"输出类型"更改为"Windows应用程序",但请注意,这意味着您不能使用Console.In,因为它将成为nullstreamreader。

    但是,Console.OutConsole.Error似乎仍然工作良好。