2011-02-11 3 views
0

항상 최상위 창으로 설정되는 WPF 앱에서 작업하고 있습니다. 사용자가 터치 스크린 모니터를 조정할 수있는 외부 프로그램을 실행하는 버튼을이 앱에 추가했습니다.외부 프로세스 시작 및 완료 후 값 설정

메인 윈도우의 최상위 설정을 해제하고 내 앱을 시작할 수 있지만이 외부 앱이 종료 된 후에 MainWindow.Topmost를 true로 설정할 수 있어야합니다.

프로세스가 끝날 때 최상위로 재설정 할 수있는 프로세스를 시작할 때 이벤트 처리기를 추가하는 것이 좋습니다. 이벤트 핸들러는 새로운 것이므로 어떻게하는지 잘 모르겠습니다. 누군가 그것을 통해 나를 걸을 수 있습니까?

내 주 창에 대해 현재 최상위를 사용하지 않도록 설정하고 응용 프로그램을 시작하는 코드는 다음과 같습니다. 지금까지 그다지 중요하지 않습니다 ...

  Application.Current.MainWindow.Topmost = false; 
      System.Diagnostics.Process.Start(@"C:\path\to\app.exe"); 

많은 감사합니다.

(그리고 이벤트 핸들러 위임에 이번 주말을 읽을 수 있습니다!)

답변

2

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을 통해 종료 할

+0

어쨌든 "모달"동작을 원하기 때문에 프로세스를 기다리는 것이 더 쉬워 보입니다. –

+0

사용자에게는 더 쉽지만 잠재적으로 더 비참합니다. 사용자가 Alt + Tab을 눌러 기본 창으로 돌아 간다면 어떻게 될까요? 보정 프로세스에서 문제가 발생하여 창이 사라지지만 프로세스가 종료되지 않으면 어떻게합니까? 사용자는 앱에 덤프되지만 완전히 고정되어 있으며 닫기 버튼에 응답하지 않습니다. 그것은 절충이지만, 저에게는 약간의 여분의 코드가 그만한 가치가 있습니다. – itowlson

+0

이 시도했지만 다음 오류 가져 오기 : System.InvalidOperationException : 다른 스레드가 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다. at System.Windows.Threading.Dispatcher.VerifyAccess() – BillyPilgrim

1

당신은 기다릴 수 있습니다. 예를 들어 최대 2 분 동안 기다리고 싶다면 다음과 같이 할 수 있습니다.

process.WaitForExit(2 * 60000); // 60000ms/minute 
관련 문제