Есть ли способ скрыть окно консоли при выполнении консольного приложения?
В настоящее время я использую приложение Windows Forms для запуска консольного процесса, но я не хочу, чтобы окно консоли отображалось во время выполнения задачи.
Есть ли способ скрыть окно консоли при выполнении консольного приложения?
В настоящее время я использую приложение Windows Forms для запуска консольного процесса, но я не хочу, чтобы окно консоли отображалось во время выполнения задачи.
Ответы:
Если вы используете 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» (выполняется в свойствах проекта).
Если вы используете класс процесса, вы можете написать
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();
}
Он запускает указанную программу командной строки, ожидает ее завершения и возвращает вывод в виде строки.
Если вы создаете программу, которая не требует ввода данных пользователем, вы всегда можете просто создать ее как службу. Служба не будет отображать какой-либо пользовательский интерфейс.
Добавьте это в свой класс, чтобы импортировать файл 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
в данном случае.
Основываясь на ответе Адама Марковица выше, у меня сработало следующее:
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, который вечно работает в фоновом режиме моего компьютера как невидимый процесс. Это было проще, чем заставить работать TopShelf. Пара руководств по TopShelf не удалась, прежде чем я написал это с некоторой помощью кода, который я нашел в другом месте. ;П
Я также попытался просто изменить настройки в Visual Studio> Project> Properties> Application для запуска в качестве приложения Windows вместо консольного приложения, и что-то в моем проекте помешало этому скрыть мою консоль - возможно, потому что DSharpPlus требует запуска консоли при запуске. . Я не знаю. Какой бы ни была причина, этот класс позволяет мне легко отключить консоль после ее появления.
Надеюсь, этот Волшебник кому-то поможет. ;)