가 Exited
이벤트, 프로세스를 만들기 true로 EnableRaisingEvents을 설정하고 처리 :
Process p = new Process();
p.StartInfo.FileName = pathToApp;
p.EnableRaisingEvents = true;
p.Exited += OnCalibrationProcessExited; // hooks up your handler to the Process
p.Start();
// Now .NET will call this method when the process exits
private void OnCalibrationProcessExited(object sender, EventArgs e)
{
// set Topmost
}
코멘트 스레드에서을 당신이 최상위를 설정하기 위해 UI 스레드로 전환하기 위해 사용 Dispatcher.BeginInvoke을 수행해야합니다, 그래서 사출되는 이벤트는 작업자 스레드에서 제기됩니다 :
private void OnCalibrationProcessExited(object sender, EventArgs e)
{
Action action =() => { /* set Topmost */ };
Dispatcher.BeginInvoke(DispatcherPriority.Normal, action);
}
(이 코드는 Window 클래스에 있다고 가정합니다. 그렇지 않다면, 대신 Application.Current.MainWindow.Dispatcher.BeginInvoke(...)
과 같은 것을 써야합니다.)
참고 Process 개체를 생성하고 구성하는 것을 분리했습니다. 프로세스가 시작되면 전에 모든 이벤트 처리 작업이 이루어져야합니다. 그렇지 않으면 처리기를 설치하기 전에 프로세스가 종료 될 수 있습니다 (이론적으로는 가능하지만 이론적으로 가능합니다!). 핸들러는 결코 호출되지 않습니다. 영원히 대기에서 프로세스를 방지하기 위해 시간 제한 값을 제공하려면
Application.Current.MainWindow.Topmost = false;
var process = System.Diagnostics.Process.Start(@"C:\path\to\app.exe");
process.WaitForExit();
Application.Current.MainWindow.Topmost = true;
, 즉도 가능하다 : 프로세스가 Process.WaitForExit을 통해 종료 할
어쨌든 "모달"동작을 원하기 때문에 프로세스를 기다리는 것이 더 쉬워 보입니다. –
사용자에게는 더 쉽지만 잠재적으로 더 비참합니다. 사용자가 Alt + Tab을 눌러 기본 창으로 돌아 간다면 어떻게 될까요? 보정 프로세스에서 문제가 발생하여 창이 사라지지만 프로세스가 종료되지 않으면 어떻게합니까? 사용자는 앱에 덤프되지만 완전히 고정되어 있으며 닫기 버튼에 응답하지 않습니다. 그것은 절충이지만, 저에게는 약간의 여분의 코드가 그만한 가치가 있습니다. – itowlson
이 시도했지만 다음 오류 가져 오기 : System.InvalidOperationException : 다른 스레드가 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다. at System.Windows.Threading.Dispatcher.VerifyAccess() – BillyPilgrim