如何从使用System.Diagnostic.Process执行的exe中抑制对话框?

时间:2011-09-28 16:22:24

标签: c# .net windows process

我正在使用System.Diagnostic.Process来调用另一个.exe。我正在创建一个目的是在远程服务器上运行的应用程序。这个.exe有时崩溃,并且有一个消息弹出窗口停止整个过程 - > [应用程序名称]遇到问题并被迫关闭。我正试图找到一种方法让我的c#程序忽略这个弹出窗口并继续执行。

3 个答案:

答案 0 :(得分:3)

修复错误,而.exe被称为非选项吗?

答案 1 :(得分:1)

在这种情况下,如果您的进程无法正常工作,您将看到一个Windows默认弹出窗口,但是如果您想知道该进程是否成功运行,那么此代码将适用于您

订阅Process.Exited事件,然后检查Process.ExitCode:

 public void StartProcess()
{
 p.StartInfo.FileName = BasePath;
 p.StartInfo.Arguments = args;
 p.Start();
 p.Exited += new EventHandler(Process_Exited);
}

void Process_Exited(object sender, EventArgs e)
{
var p = sender as Process;
if (p.ExitCode != 0)
    MessageBox.Show(string.Format("Process failed: ExitCode = {0}", p.ExitCode));
}

答案 2 :(得分:0)

恕我直言,运行这样一个错误的exe的最干净的选择是启动它给你的进程调试权限(你可能必须通过P / Invoke显式调用CreateProcess并带有DEBUG_PROCESS标志进程创建标志)然后让一个线程处理由WaitForDebugEvent提供的调试事件;每当你得到一个未处理的最后机会异常时,你可以通知主线程,杀死子进程(从而避免使用默认的Windows异常处理程序)并在必要时重新启动它,在所有其他情况下只需调用ContinueDebugEvent让它程序正常运行。

请注意,WaitForDebugEvent提供的“事件结构”指针在C#中可能很难处理。


编辑 :幸运的是,似乎有人为本机调试API创建了一个很好的托管包装器,请参阅here