2011-02-11 81 views
0

後,我正在被設置爲始終是最頂層窗口一個WPF應用程序。我在這個應用程序中添加了一個按鈕,它啓動了一個外部程序,允許用戶校準我們的用戶將與之交互的觸摸屏顯示器。啓動一個外部進程並設置值時,它完成

我已經可以把我們的主窗口的最上面的設置關閉,啓動我的應用程序,但我需要能夠這樣外部應用程序退出後設置我們MainWindow.Topmost爲true。

它已經建議我開始當過程結束,可以最頂層的復位過程中,當添加事件處理程序。事件處理程序對我來說是新手,所以我不知道如何執行此操作。有人能通過它走過我嗎?

這裏是我目前最上面的禁用我的主窗口,並啓動我的應用程序的代碼。到目前爲止沒有多少...

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

非常感謝。

(我會在事件處理程序和代表閱讀了這個週末!)

回答

2

創建流程,設置EnableRaisingEvents爲true,並處理Exited事件:

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 
} 

從評論螺紋,在工作者線程上引發Exited事件,因此您需要使用Dispatcher.BeginInvoke切換到UI線程以設置Topmost:

private void OnCalibrationProcessExited(object sender, EventArgs e) 
{ 
    Action action =() => { /* set Topmost */ }; 
    Dispatcher.BeginInvoke(DispatcherPriority.Normal, action); 
} 

(這裏假定代碼在你的Window類中。如果沒有,你需要寫類似Application.Current.MainWindow.Dispatcher.BeginInvoke(...)代替。)

注意我已經分居創建和啓動它配置Process對象。雖然這是更詳細的,有必要確保所有的事件處理的東西到位之前的過程開始 - 否則,你把處理到位之前,過程可能退出(!不可能的,但理論上是可能的),你的處理程序永遠不會被調用。

+0

似乎更容易等待的過程,因爲他希望「模態」的行爲反正。 – 2011-02-11 22:33:57

1

可以等待的過程中通過Process.WaitForExit退出:

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

如果你想提供一個超時值,以防止永遠等待的過程,這也是可能的。例如,如果你想等待最多2分鐘,你可以這樣做:

process.WaitForExit(2 * 60000); // 60000ms/minute 
相關問題