2012-08-09 34 views
0

我的程序是win窗體(c#)。它應該打開一個外部程序,做一個主窗口的打印屏幕,然後關閉它。 通過使用Process.Start()我可以打開程序,但所有的焦點都在它上面,我的代碼被暫停。只有當我自己關閉它時,我的表單纔會繼續 - 但截圖的時間太晚了。 那麼如何強制我的代碼繼續運行?Process.Start()並繼續使用我的代碼

public void Runttk(string maromnum) 
    { 
     Process runttk = new Process(); 
     runttk.StartInfo.UseShellExecute = true;    
     runttk.StartInfo.FileName = @"C:\\program.exe"; 
     runttk.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
     runttk.Start(); 
     this.Focus(); 
     try 
     { 
      if (runttk.WaitForInputIdle()==true) 
      {           
       PringJpg(maromnum); 
       Killttk(); 
      } 
     } 
     catch (Exception e) 
     { 
     } 

    } 

謝謝

UPDATE: eventuanlly我用了Thread.Sleep(3000)。 Crued,但要訣竅。 我沒有使用backgroundworker,因爲壓縮程序和extenral程序之間的同步不夠清晰。

+1

單獨的線程 – dtsg 2012-08-09 10:14:01

+0

Process.Start()會立即將控制權返回給您的程序。在調試器下運行它,或者添加一些Debug.WriteLine()來查看代碼停止的位置。也許WaitForInputIdle()不會返回,直到外部程序退出? – 2012-08-09 10:16:13

+0

相關:http://stackoverflow.com/questions/2740038/how-do-i-wait-until-a-console-application-is-idle 因此,跨進程使用同步對象。 – 2012-08-09 10:19:06

回答

1

嘗試你的代碼,但與另一個程序,如notepad.exe,記事本運行,然後控制下降通過您調用PringJpg。

所以我認爲問題是,它是阻止如果(runttk.WaitForInputIdle()==真),請嘗試添加此操作超時。

+0

嘿,正如我所說的塞巴斯蒂安超時是一個問題 - 我無法預測需要多少時間。 – 2012-08-09 10:43:41

1

也許你的程序從不空閒 - 意味着runttk.WaitForInputIdle()==true讓你的應用程序等到你關閉它。

添加限制(例如runttk.WaitForInputIdle(500)==true)應滿足您的需求。

+0

@Sebastian,這個檢查是針對正在運行的進程進行的,這是一個贏取表單應用程序,而不是控制檯窗口。 – 2012-08-09 10:22:24

+0

好點,如果外部應用程序是一個控制檯應用程序 – 2012-08-09 10:22:28

+0

darn ..做了一個忍者刪除。我寫的基本上是:控制檯窗口沒有(窗口)用戶界面,因此他們永遠不會進入InputIdle狀態,並且對'runttk.WaitForInputIdle()'的調用被阻止。 – 2012-08-09 10:23:26