Answers:
如果使用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
如果您编写了控制台应用程序,则可以默认将其隐藏。
创建一个新的控制台应用程序,然后将“输出类型”类型更改为“ Windows应用程序”(在项目属性中完成)
如果您使用的是Process Class,则可以编写
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
之前yourprocess.start();
和过程将被隐藏
简单的答案是:转到控制台应用程序的属性(项目的属性)。在“应用程序”选项卡中,只需将“输出类型”更改为“ Windows应用程序”。就这样。
您可以使用FreeConsole API从过程中分离控制台:
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(当然,这仅在您有权访问控制台应用程序的源代码时适用)
FreeConsole
做什么它的名字一样,它不会阻止Windows显示它被调用之前控制台。
[DllImport("kernel32.dll")] static extern bool AllocConsole();
让你轻松运行用从一个标准的Win32应用程序控制台
如果您对输出感兴趣,可以使用以下功能:
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();
}
它运行给定的命令行程序,等待它完成并以字符串形式返回输出。
如果要创建不需要用户输入的程序,则始终可以将其创建为服务。服务不会显示任何类型的UI。
将此添加到您的类以导入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);
我知道我没有完全回答您想要的内容,但是我想知道您是否在问正确的问题。
您为什么不使用:
如果您只想运行一个进程,这些听起来是更好的选择。
尽管如此处其他答案所述,您可以将“输出类型”更改为“ Windows应用程序”,但是请注意,这将意味着您将无法使用Console.In
它,因为它将成为NullStreamReader。
Console.Out
并且Console.Error
似乎仍然可以正常工作。
Console.In
没有控制台输入内容时,为什么有人会使用?可以从哪里访问什么东西Console.In
?这根本没有任何意义。换句话说:这完全是显而易见的,合乎逻辑的Console.In
是NullStreamReader
在这种情况下。
基于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要求在启动时启动控制台。我不知道。不管是什么原因,此类都可以让我在弹出控制台后轻松终止控制台。
希望这位魔术师能帮助到别人。;)