Есть ли способ скрыть окно консоли при выполнении консольного приложения?
В настоящее время я использую приложение 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" (сделано в свойствах проекта)
Если вы используете Process Class, вы можете написать
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
до yourprocess.start();
, и процесс будет скрыт
Простой ответ: Перейдите в свойства приложения консоли (свойства проекта). На вкладке "Приложение" просто измените "Тип вывода" на "Приложение Windows". Это все.
Вы можете использовать API FreeConsole, чтобы отсоединить консоль от процесса:
[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();
}
Он запускает заданную программу командной строки, ждет ее завершения и возвращает результат как строку.
Если вы создаете программу, которая не требует ввода пользователя, вы всегда можете просто создать ее как службу. Служба не будет показывать какой-либо пользовательский интерфейс.
Я знаю, что не отвечаю точно, что вы хотите, но мне интересно, задаете ли вы правильный вопрос.
Почему бы вам не использовать:
Звучат как лучшие параметры, если вы хотите только запустить процесс.
Добавьте это в свой класс, чтобы импортировать 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> Project> Properties> Application для запуска в качестве приложения Windows вместо консольного приложения, и что-то в моем проекте не позволило скрыть мою консоль - возможно, из-за того, что DSharpPlus требует запуска консоли при запуске, Я не знаю. Безотносительно причины этот класс позволяет мне легко убить консоль после того, как она появляется.
Надеюсь, этот волшебник кому-нибудь поможет. ;)
Хотя в качестве других ответов здесь сказано, что вы можете изменить "Тип вывода" на "Приложение Windows", помните, что это будет означать, что вы не можете использовать Console.In
, поскольку он станет NullStreamReader.
Console.Out
и Console.Error
, похоже, все еще работают нормально.
Просто напишите
ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......
psi.CreateNoWindow = true;