Чи є спосіб приховати вікно консолі під час виконання консольного додатка?
Наразі я використовую програму 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();
(звичайно, це застосовується лише в тому випадку, якщо у вас є доступ до вихідного коду програми консолі)
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();
.
При запуску програми консоль спалахне, натиснувши на неї. При виконанні командного рядка командний рядок зникає дуже скоро після виконання.
Я роблю це для бота розбрату, який вічно працює на тлі мого комп’ютера як невидимий процес. Це було простіше, ніж змусити TopShelf працювати на мене. Кілька навчальних посібників з TopShelf провалили мене, перш ніж я написав це за допомогою допомоги з коду, який я знайшов в іншому місці. ; P
Я також спробував просто змінити налаштування в Visual Studio> Project> Properties> Application для запуску як додатка Windows замість консольного додатка, і щось про мій проект заважало цьому приховувати консоль - можливо, тому що DSharpPlus вимагає запустити консоль при запуску. . Не знаю. Незалежно від причини, цей клас дозволяє мені легко вбити консоль після того, як вона спливе.
Сподіваюся, цей фокусник комусь допомагає. ;)