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.