2016-07-06 5 views
0

어딘가를 종료 대기 : Form.Closing 이벤트에부드럽게 응용 프로그램을 닫기하고, <a href="https://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=vs.110).aspx" rel="nofollow"><code>Process</code></a> 유형 인 내가 <code>proc</code>의 인스턴스를 생성 응용 프로그램에서이 같은

proc = new Process(); 
proc.EnableRaisingEvents = true; 
proc.StartInfo.FileName = Settings.Instance.OBSExeFile; 
proc.Exited += (a, b) => doSomething(); 
proc.Start(); 
proc.WaitForInputIdle(); 

, 나는 부드럽게 닫으시겠습니까 , 아직 열려 있다면.

내가 (둘 Close()Kill()CloseMainWindow() 내 요구에 맞게 보이지 않았다) 그래서 다음과 같이 응용 프로그램에 WM_CLOSE를 보내고 Process.WaitForExit()를 호출하고 최대 eneded의 .NET 내에서 고유 물건이 작업을 수행하는 다른 방법을 찾을 :

if (proc != null && !proc.HasExited) { 
    if(SendMessage(proc.MainWindowHandle, WM_CLOSE, 0, IntPtr.Zero) == 0) 
     proc.WaitForExit(); 
} 

내 질문은 :이되는 에서 위험한 어떤 방법을 혼합하는 의미에서 뭔가를 놓치고 있습니까? 예를 들어, WaitForExit()을 영원히 정지시킬 수 있습니까?

+0

"누락 된 항목"인지 묻는 것은 너무 광범위합니다. 당신이 누락 될 수있는 많은 것들이 있습니다; 위의 게시물에서 전체 연구 노력에 대한 모든 세부 사항을 제공하지 않았다면 간과 할 수도있는 것을 알 수있는 방법이 없습니다. 마지막으로 그러한 세부 사항을 모두 제공했다면, 충분한 연구를하지 못한 것입니다. 'WaitForExit()'가 멈출 수 있습니까? 물론 ... WM_CLOSE를 윈도우에 보낼 때 주어진 프로세스가 종료된다는 보장은 없습니다. 협력 적으로 폐쇄되는 메커니즘은 모두 동일한 위험을 겪습니다. Windows가 말했을 때 닫히지 않는 프로세스에 대한 제한 시간을 제공하는 이유입니다 –

답변

0

메시지를 보내고 메시지를 닫습니다 (어떤 방식 으로든 적합하다고 생각하는 경우). 나는 이것을하는 일련의 프로그램을 가지고 있는데, 나는 이것을 위해 127.0.0.1에 udp 브로드 캐스트를 사용한다.

0

제공된 정보를 바탕으로 좋은 접근 방식은 .exe 대신 Windows 서비스를 만드는 것입니다. 그러면 프로세스를 완전히 제어 할 수 있습니다.

Windows 서비스에서 stop 명령을 보내면 현재 서비스를 "부드럽게 닫는"코드를 만들 수 있습니다.