How to run a C# console application with the console hidden
有没有办法隐藏窗口的控制台控制台应用程序时执行A?
我正在使用的Windows窗体应用程序启动过程一控制台,但我不想显示在控制台窗口的任务是运行。
如果编写了控制台应用程序,则可以在默认情况下将其隐藏。
创建新的控制台应用程序,然后将"输出类型"类型更改为"Windows应用程序"(在项目属性中完成)
如果使用
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; |
在
简单的答案是:转到控制台应用程序的属性(项目的属性)。在"应用程序"选项卡中,只需将"输出类型"更改为"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); } } } |
只需将这个类包含在您的项目中,并调用
当您通过点击启动程序时,控制台将闪烁。从命令提示符执行时,命令提示符在执行后很快消失。
我这样做是为了一个不和谐的机器人,它作为一个不可见的过程永远在我的计算机的背景下运行。为我工作比让托普希夫容易。在我在其他地方找到的代码的帮助下写这篇文章之前,有几个Topshelf教程让我失败了。P
我还尝试简单地将Visual Studio>项目>属性>应用程序中的设置更改为以Windows应用程序而不是控制台应用程序的形式启动,并且我的项目的某些内容阻止了这一操作隐藏我的控制台-可能是因为Dsharpplus要求在启动时启动控制台。我不知道。不管是什么原因,这个类允许我在控制台弹出后轻松地杀死它。
希望这位魔术师能帮助别人。;)
根据上面亚当·马尔科维茨的回答,以下是我的工作:
1 2 3 4 5 6 |
将此添加到类以导入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 |
尽管这里的其他答案已经说过,您可以将"输出类型"更改为"Windows应用程序",但请注意,这意味着您不能使用
但是,