Ukryj okno konsoli z Process.Start C #

102

Próbuję utworzyć proces na zdalnej maszynie przy użyciu klasy System.Diagnostics.Process. Potrafię stworzyć proces. Problem w tym, że tworzenie usługi trwa długo i wyświetla się okno konsoli. Inną irytującą rzeczą jest to, że okno konsoli jest wyświetlane na górze mojego formularza Windows i nie mogę wykonywać żadnych innych operacji na tym formularzu. Ustawiłem wszystkie właściwości takie jak CreateNoWindow = true:

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

ale nadal pokazuje okno konsoli. nawet ja przekierowałem wyjście i błędy do oddzielnego strumienia, ale bez powodzenia.

Czy jest inny sposób na ukrycie okna konsoli? Proszę pomóż mi .

Oto część mojego kodu, której użyłem do wykonania polecenia sc.

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
Prasad
źródło
Czy próbowałeś ustawić proc.StartInfo.RedirectedStandardOutput = true? Mam to do pracy z aplikacją Windows.
poy
jakieś ostateczne rozwiązanie z pełną próbką kodu źródłowego nad tym działającą?
Kiquenet,
W aplikacji konsoli systemu Windows po prostu ustawienie UseShellExecute - bez przekierowania lub cokolwiek innego - działało dla mnie. Zobacz tutaj .
Paul
Jeśli chodzi o otwieranie i blokowanie formularza w oknie konsoli, powinieneś uruchomić proces jako zadanie lub w nowym wątku
Ryan Dooley,
Dlaczego siadasz UseShellExecutei CreateNoWindowdwa razy?
Mike Lowery

Odpowiedzi:

119

Miałem podobny problem podczas próby uruchomienia procesu bez wyświetlania okna konsoli. Testowałem z kilkoma różnymi kombinacjami wartości właściwości, aż znalazłem taki, który wykazywał pożądane zachowanie.

Oto strona wyjaśniająca, dlaczego UseShellExecutewłaściwość musi być ustawiona na false.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

W sekcji Uwagi na stronie:

Jeśli właściwość UseShellExecute ma wartość true lub właściwości UserName i Password nie mają wartości null, wartość właściwości CreateNoWindow jest ignorowana i tworzone jest nowe okno.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}
John Bartels
źródło
2
Chcesz dodać dodatkowe szczegóły? Dlaczego to działa zamiast how .
aqua
2
Czy to dlatego, że standardowe wyjście wymusza istnienie okna?
Denise Skidmore
1
I najwyraźniej nie można przekierować standardowego wyjścia bez ustawieniastartInfo.UseShellExecute = false;
Denise Skidmore
1
Jestem ciekaw, dlaczego w tej innej odpowiedzi użyli UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore
10
Nigdy nie zrozumiem, dlaczego ludzie łapią wyjątek, który i tak ponownie rzucają.
Blindy
54

Miałem pecha z tą odpowiedzią, ponieważ proces (Wix light.exe) zasadniczo wychodził na lunch i nie wracał do domu na czas na kolację. Jednak dla mnie dobrze działały:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process
John Lockwood
źródło
2
U mnie zadziałało - ładne i proste!
J c
2
To naprawdę powinna być akceptowana odpowiedź. Działa jak marzenie.
Eternal21
2
CreateNoWindow = truedla mnie nie zadziałało, to
zadziałało
3
Działa tylko dla aplikacji z oknem, aplikacja konsoli nadal wyświetla okno
Geograph
18

To powinno działać, spróbuj;


Dodaj odniesienie do systemu.

using System.Diagnostics;

Następnie użyj tego kodu, aby uruchomić polecenie w ukrytym oknie CMD.

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();
Roshana Pitigala
źródło
11

To nie pokazuje okna:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.CreateNoWindow = true;

...
cmd.Start();
Leonardo Rignanese
źródło