Process.Start()并继续使用我的代码

问题描述:

我的程序是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://*.com/questions/2740038/how-do-i-wait-until-a-console-application-is-idle 因此,跨进程使用同步对象。 – 2012-08-09 10:19:06

尝试你的代码,但与另一个程序,如notepad.exe,记事本运行,然后控制下降通过您调用PringJpg。

所以我认为问题是,它是阻止如果(runttk.WaitForInputIdle()==真),请尝试添加此操作超时。

+0

嘿,正如我所说的塞巴斯蒂安超时是一个问题 - 我无法预测需要多少时间。 – 2012-08-09 10:43:41

也许你的程序从不空闲 - 意味着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