Process.Start C #에서 콘솔 창 숨기기


102

System.Diagnostics.Process 클래스를 사용하여 원격 컴퓨터에서 프로세스를 만들려고합니다. 프로세스를 만들 수 있습니다. 그러나 문제는 서비스 생성에 시간이 오래 걸리고 콘솔 창이 표시된다는 것입니다. 또 다른 성가신 점은 콘솔 창이 내 창 양식 위에 표시되고 해당 양식에서 다른 작업을 수행 할 수 없다는 것입니다. 다음과 같은 모든 속성을 설정했습니다 CreateNoWindow = true.

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

하지만 여전히 콘솔 창을 보여줍니다. 출력과 오류를 별도의 스트림으로 리디렉션했지만 운이 없습니다.

콘솔 창을 숨기는 다른 방법이 있습니까? 제발 도와주세요.

다음은 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();

설정을 시도해 보셨습니까 proc.StartInfo.RedirectedStandardOutput = true? Windows 응용 프로그램과 함께 작동하도록했습니다.
poy

전체 소스 코드 샘플이 작동하는 최종 솔루션이 있습니까?
Kiquenet 2013

Windows 콘솔 앱에서 단순히 UseShellExecute를 설정하면-리디렉션 또는 기타 없음-저에게 효과적이었습니다. 를 참조하십시오 여기 .
Paul

콘솔 창을 열고 양식을 잠그는 한 작업 또는 새 스레드에서 프로세스를 실행해야합니다
Ryan Dooley

왜 설정 UseShellExecute하고 CreateNoWindow두 번?
Mike Lowery 2019

답변:


119

콘솔 창을 표시하지 않고 프로세스를 시작하려고 할 때 비슷한 문제가 발생했습니다. 내가 원하는 동작을 나타내는 것을 찾을 때까지 여러 가지 속성 값 조합으로 테스트했습니다.

다음은 UseShellExecute속성을 false로 설정해야하는 이유를 자세히 설명하는 페이지 입니다.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

페이지의 비고 섹션에서 :

UseShellExecute 속성이 true이거나 UserName 및 Password 속성이 null이 아니면 CreateNoWindow 속성 값이 무시되고 새 창이 생성됩니다.

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;
}

2
추가 세부 정보를 추가 하시겠습니까? 는 이 오히려보다 작동 방법 .
aqua '

2
표준 출력으로 인해 창이 존재하기 때문입니까?
Denise Skidmore

1
그리고 분명히 당신은 설정하지 않고 표준 출력을 리디렉션 할 수 없습니다startInfo.UseShellExecute = false;
데니스 스키드 모어

1
왜 다른 답변에서 UseShellExecute = true를 사용했는지 궁금합니다. stackoverflow.com/questions/2317767/c-process-start-hide
데니스 스키드 모어에게

10
사람들이 어쨌든 다시 던지는 예외를 포착하는 이유를 이해하지 못할 것입니다.
Blindy

54

나는이 대답에 불운을 보였습니다. 프로세스 (Wix light.exe)는 본질적으로 점심 식사에 나가고 저녁 시간에 집에 오지 않았습니다. 그러나 다음은 나를 위해 잘 작동했습니다.

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

2
나를 위해 일했습니다-멋지고 간단합니다!
J c

2
이것은 정말로 받아 들여지는 대답이어야합니다. 매력처럼 작동합니다.
Eternal21 2014

2
CreateNoWindow = true나를 위해 일하지 않았다, 이것은했다 :)
Stefan Monov

3
창이있는 응용 프로그램에서만 작동합니다. 콘솔 응용 프로그램은 여전히 ​​창을 표시합니다
Geograph

18

이것은 작동합니다.


시스템 참조를 추가하십시오.

using System.Diagnostics;

그런 다음이 코드를 사용하여 숨겨진 CMD 창에서 명령을 실행합니다.

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();

11

이것은 창을 표시하지 않습니다.

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

...
cmd.Start();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.