149

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

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

4

13 回答 13

215

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

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

于 2009-05-07T23:31:19.640 回答
164

如果您正在使用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
于 2009-05-07T19:06:13.130 回答
69

If you are using Process Class then you can write

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

before yourprocess.start(); and process will be hidden

于 2009-05-11T14:20:55.360 回答
44

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

于 2010-09-03T07:25:45.877 回答
22

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

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

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

于 2009-05-07T19:20:52.003 回答
7

如果您对输出感兴趣,可以使用此功能:

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

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

于 2015-04-09T09:51:09.137 回答
4

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

于 2009-05-07T23:24:49.390 回答
3

将此添加到您的类以导入 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);
于 2016-07-06T10:14:16.953 回答
1

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

Console.Out并且Console.Error似乎仍然可以正常工作。

于 2013-04-09T11:00:23.050 回答
1

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

你为什么不使用:

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

如果您只想运行一个进程,那么这些听起来像是更好的选择。

于 2009-05-07T19:06:48.433 回答
1

根据上面亚当马科维茨的回答,以下对我有用:

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();
于 2017-07-14T05:48:10.273 回答
1

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

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 要求在启动时启动控制台. 我不知道。不管是什么原因,这个类让我可以在控制台弹出后轻松杀死它。

希望这位魔术师对某人有所帮助。;)

于 2018-11-01T18:58:26.407 回答
0

写吧

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

psi.CreateNoWindow = true;
于 2017-03-02T06:37:38.763 回答