Как запустить консольное приложение C # со скрытой консолью

StackOverflow https://stackoverflow.com/questions/836427

  •  08-07-2019
  •  | 
  •  

Вопрос

Есть ли способ скрыть окно консоли при запуске консольного приложения?

В настоящее время я использую приложение Windows Forms для запуска процесса консоли, но не хочу, чтобы окно консоли отображалось во время выполнения задачи.

Это было полезно?

Решение

Если вы используете класс 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);
    

    Исходя из ответа Адама Марковица выше, у меня сработало следующее:

    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 не помогли мне, прежде чем я написал это с помощью кода, который я нашел в другом месте. ; Р

    Я также попытался просто изменить настройки в Visual Studio > Проект > Свойства > Приложение запускалось как приложение Windows вместо консольного приложения, и что-то в моем проекте помешало этому скрыть мою консоль - возможно, из-за того, что DSharpPlus требует запуска консоли при запуске. Я не знаю. Безотносительно причины этот класс позволяет мне легко убить консоль после того, как она появляется.

    Надеюсь, этот волшебник кому-нибудь поможет. ;)

    Просто напишите

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

    Хотя, как уже говорилось в других ответах, вы можете изменить " Тип вывода " чтобы "Приложение Windows", учтите, что это означает, что вы не можете использовать Console.In , так как он станет NullStreamReader.

    Console.Out и Console.Error , похоже, все еще работают нормально.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top