2014-12-02 181 views
0

我在我啓動其他應用程序APP2一個Windows C#應用程序APP1,通過點擊一個按鈕,具有:塊事件等待當進程退出

var myProc = Process.Start("app2.exe", myArgs); 
myProc.WaitForExit();//to wait I finish with app2.exe 

這個偉大的工程,但我有另外兩個問題app2已打開:

  1. 如果我點擊任務欄中的app1圖標,app1會到達正常位置,並且app2會背景。
  2. 如果我點擊了app1中的按鈕,相應的動作會在app2完成後執行。所以app1會在內存中保存我點擊的按鈕並執行之後的所有操作。

那麼如何保持app2在前面,即使當我點擊app1圖標(我不確定它是可能的,因爲app1和app2是完全不同的應用程序)?

對我來說更重要的是如何讓app1在app2打開時不響應/保持內存事件?

+0

你剛纔所描述的APP1開闢爲您所需的模態窗口的行爲行爲。那麼app2真的應該是一個獨立的應用程序在你的情況? – 2014-12-02 11:50:39

+0

不是真的,用普通的模態窗口,打開模態窗口的窗口不會接收事件,也不會在模態窗口打開時將它們保存在內存中。是的,app2必須是一個獨立的應用程序。 – SteveTJS 2014-12-02 12:00:27

回答

0

一個解決方案是禁用第一個應用程序的所有窗口,只要該子進程正在運行。另外,可以將應用程序的主窗口設置爲子應用程序打開的窗口的所有者(如果子應用程序顯示任何窗口)。

如果您提供有關您正在使用的技術的更多詳細信息,我們可以提供進一步的幫助。

+0

事實上,我的app1是一個C#應用程序,我啓動了app2,它是一個獨立的獨立應用程序(在Qt中)。但我會嘗試你的想法並禁用我的app1的窗口。 – SteveTJS 2014-12-02 12:02:10

+0

最後,我只是在啓動app2之前顯示一個警告對話框來禁用我的所有app1。在這個對話框中,我放了一個關閉app2的按鈕(殺死進程)和對話框本身。但是我有一個新問題,當我退出app2時,我無法自動關閉對話框,因爲在打開對話框時,process.exit事件(我想要關閉對話框)不會被觸發。 – SteveTJS 2014-12-03 09:13:59

0

可以使用

`myProcess.windowstyle` 

設置啓動APP 2最小化,或者如果我沒有記錯,甚至隱藏processWindowStyle.Hidden

您也可以將您在上面APP1使用

myForm.Topmost = true;

要確保您的應用程序不會再對使用按鍵的響應,您可以禁用按鈕

myButton.Enabled = false; 

就在您啓動應用2之前,並在您的 myProcess.WaitForExit() 方法之後重新啓用它們。

0

按照Dirk Vollmar的建議禁用表單,但也可以使用Async/await和Task.Run()在禁用時抽取隊列。這會導致應用程序丟棄所有的用戶輸入,而形式是禁用的,而不是排隊它,處理它的形式再次啓用後:

private async void button1_Click(object sender, EventArgs e) 
    { 
     this.Enabled = false; 
     await Task.Run(() => 
     { 
      var myProc = Process.Start("calc"); 
      myProc.WaitForExit(); 
     });    
     this.Enabled = true; 
    }