如何在隐藏控制台的情况下运行C#控制台应用程序
-
08-07-2019 - |
题
有没有办法在执行控制台应用程序时隐藏控制台窗口?
我目前正在使用Windows窗体应用程序来启动控制台进程,但我不希望在任务运行时显示控制台窗口。
解决方案
如果您使用的是 ProcessStartInfo
类,则可以将窗口样式设置为隐藏:
System.Diagnostics.ProcessStartInfo start =
new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
其他提示
如果您编写了控制台应用程序,则可以将其隐藏起来。
创建一个新的控制台应用,然后更改“输出类型”键入“Windows应用程序” (在项目属性中完成)
如果您正在使用Process Class,那么您可以编写
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
之前 yourprocess.start();
和进程将被隐藏
简单的答案是:转到您的控制台应用程序的属性(项目的属性)。在“应用程序”中选项卡,只需更改“输出类型”即可到“Windows应用程序”。就是这样。
您可以使用 FreeConsole API将控制台与进程分离:
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(当然,只有在您可以访问控制台应用程序的源代码时才适用)
如果您对输出感兴趣,可以使用此功能:
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();
}
它运行给定的命令行程序,等待它完成并将输出作为字符串返回。
如果您正在创建一个不需要用户输入的程序,您可以随时将其创建为服务。服务不会显示任何类型的用户界面。
我知道我没有回答你想要的是什么,但我想知道你是否提出了正确的问题。
为什么不使用:
- Windows服务
- 创建一个新线程并在该 上运行您的流程 醇>
如果你想要的只是运行一个过程,这听起来就像是更好的选择。
将此添加到您的类以导入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);
基于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();
。
通过单击启动程序时,控制台将闪烁。从命令提示符执行时,命令提示符在执行后很快就会消失。
我为一台Discord Bot做这件事,它在我的计算机背景中永远运行,作为一个看不见的过程。这比让TopShelf为我工作更容易。在我用其他地方找到的代码提供帮助之前,我写了一些TopShelf教程。 ; P
我也尝试过简单地更改Visual Studio中的设置>项目>属性>作为Windows应用程序而不是控制台应用程序启动的应用程序,以及关于我的项目的一些事情阻止了它隐藏我的控制台 - 可能是因为DSharpPlus要求在启动时启动控制台。我不知道。不管是什么原因,这个类允许我在弹出后轻松杀死它。
希望这位魔术师帮助某人。 ;)
只需写下
ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......
psi.CreateNoWindow = true;
虽然这里的其他答案已经说过你可以改变“输出类型”。到“Windows应用程序”,请注意这意味着您不能使用 Console.In
,因为它将成为NullStreamReader。
Console.Out
和 Console.Error
似乎仍然可以正常工作。