2014-12-02 136 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; 
    }