Czy istnieje sposób na ukrycie okna konsoli podczas wykonywania aplikacji konsolowej?
Obecnie używam aplikacji Windows Forms do uruchamiania procesu konsoli, ale nie chcę, aby okno konsoli było wyświetlane, gdy zadanie jest uruchomione.
Czy istnieje sposób na ukrycie okna konsoli podczas wykonywania aplikacji konsolowej?
Obecnie używam aplikacji Windows Forms do uruchamiania procesu konsoli, ale nie chcę, aby okno konsoli było wyświetlane, gdy zadanie jest uruchomione.
Odpowiedzi:
Jeśli korzystasz z ProcessStartInfo
klasy, możesz ustawić styl okna na ukryty - w przypadku aplikacji konsolowych (nie GUI) musisz ustawić CreateNoWindow na 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
Jeśli napisałeś aplikację konsoli, możesz ją domyślnie ukryć.
Utwórz nową aplikację konsolową, a następnie zmień typ „Typ wyjścia” na „Aplikacja systemu Windows” (można to zrobić we właściwościach projektu)
Jeśli używasz klasy Process, możesz pisać
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
przed yourprocess.start();
i proces zostanie ukryty
Prosta odpowiedź jest taka: przejdź do właściwości aplikacji konsoli (właściwości projektu). Na karcie „Aplikacja” po prostu zmień „Typ wyniku” na „Aplikacja Windows”. To wszystko.
Możesz użyć FreeConsole API, aby odłączyć konsolę od procesu:
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(oczywiście dotyczy to tylko sytuacji, gdy masz dostęp do kodu źródłowego aplikacji konsolowej)
FreeConsole
robi to, co mówi jego nazwa, nie zapobiega wyświetlaniu konsoli przez system Windows przed jej wywołaniem.
[DllImport("kernel32.dll")] static extern bool AllocConsole();
umożliwia łatwe uruchamianie z konsolą ze standardowej aplikacji Win32
Jeśli jesteś zainteresowany wyjściem, możesz skorzystać z tej funkcji:
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();
}
Uruchamia podany program wiersza poleceń, czeka na jego zakończenie i zwraca wynik w postaci łańcucha.
Jeśli tworzysz program, który nie wymaga wprowadzania danych przez użytkownika, zawsze możesz go po prostu utworzyć jako usługę. Usługa nie wyświetla żadnego interfejsu użytkownika.
Dodaj to do swojej klasy, aby zaimportować plik 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;
A jeśli chcesz to ukryć, użyj tego polecenia:
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
A jeśli chcesz pokazać konsolę:
var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);
Wiem, że nie odpowiadam dokładnie na to, czego chcesz, ale zastanawiam się, czy zadajesz właściwe pytanie.
Dlaczego nie użyjesz albo:
Brzmi to jak lepsze opcje, jeśli chcesz tylko uruchomić proces.
Chociaż, jak powiedziały inne odpowiedzi tutaj, możesz zmienić „Typ wyjścia” na „Aplikacja Windows”, pamiętaj, że oznacza to, że nie możesz używać, Console.In
ponieważ stanie się NullStreamReader.
Console.Out
i Console.Error
wydaje się, że nadal działa dobrze.
Console.In
gdy nie ma konsoli do wprowadzania czegoś? Skąd powinno pochodzić coś, do czego można uzyskać dostęp przez Console.In
? To w ogóle nie ma sensu. Innymi słowy: jest to całkowicie oczywiste i logiczne, że tak Console.In
jest NullStreamReader
w tym przypadku.
W oparciu o powyższą odpowiedź Adama Markowitza, zadziałały dla mnie:
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();
Mam ogólne rozwiązanie do udostępnienia:
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);
}
}
}
Po prostu włącz tę klasę do swojego projektu i zadzwoń Magician.DisappearConsole();
.
Konsola będzie migać po uruchomieniu programu poprzez jej kliknięcie. Podczas wykonywania z wiersza polecenia wiersz polecenia znika bardzo szybko po wykonaniu.
Robię to dla Discord Bota, który działa wiecznie w tle mojego komputera jako niewidoczny proces. To było łatwiejsze niż sprawienie, żeby TopShelf pracował dla mnie. Kilka samouczków TopShelf zawiodło mnie, zanim napisałem to z pomocą kodu, który znalazłem gdzie indziej. ; P
Próbowałem też po prostu zmienić ustawienia w Visual Studio> Projekt> Właściwości> Aplikacja, aby uruchomić jako aplikację systemu Windows zamiast aplikacji konsolowej, a coś w moim projekcie zapobiegło ukryciu mojej konsoli - być może dlatego, że DSharpPlus wymaga uruchomienia konsoli przy starcie . Nie wiem Bez względu na powód, ta klasa pozwala mi łatwo zabić konsolę po jej pojawieniu się.
Mam nadzieję, że ten Mag komuś pomoże. ;)