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

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

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

180780 次浏览

如果你使用的是 ProcessStartInfo类,你可以将窗口样式设置为隐藏-在控制台(而不是 GUI)应用程序的情况下,你必须将 CreateNoWindow 设置为 true:

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

我知道我回答的不是你想要的但我想知道你是不是问对了问题。

你为什么不用:

  1. 视窗服务
  2. 创建一个新线程并在其上运行进程

如果您想要的只是运行流程,那么这些听起来是更好的选择。

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

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

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

如果您正在创建一个不需要用户输入的程序,那么您总是可以将它创建为一个服务。服务不会显示任何类型的 UI。

如果你写了控制台应用,你可以默认隐藏它。

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

如果使用 ProcessClass,则可以编写

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

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

简单的答案是: 访问控制台应用程序的属性(项目的属性)。在“应用程序”选项卡中,只需将“输出类型”更改为“ Windows 应用程序”。仅此而已。

虽然这里的其他答案说你可以改变“输出类型”到“ Windows 应用程序”,请注意,这将意味着你不能使用 Console.In,因为它将成为一个 NullStreamReader。

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

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

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

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

将其添加到类中以导入 DLL 文件:

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


[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();


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

然后,如果你想隐藏它,使用这个命令:

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

如果你想显示控制台:

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

写吧

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


psi.CreateNoWindow = true;

基于 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();

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

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 为我工作容易多了。在我写这篇文章之前,TopShelf 的一些教程让我失望了,这些教程是从我在其他地方找到的代码中获得的一些帮助。; P

我还尝试简单地改变 Visual Studio > Project > Properties > Application 中的设置,使其作为一个 Windows 应用程序而不是一个控制台应用来启动,我的项目中的一些东西阻止了我隐藏我的控制台——也许是因为 DSharpPlus 需要在启动时启动一个控制台。我不知道。不管是什么原因,这个类允许我在控制台弹出后轻松关闭它。

希望这个魔术师能帮助别人