我正在使用System.Diagnostics.Process启动外部进程。这是批处理作业的一部分,因此如果一个进程崩溃,我希望能够处理它并让其余进程继续运行。
目前发生的情况是Windows弹出一个对话框告诉我程序已经崩溃,只有手动关闭对话框后进程才会退出。
根据这个问题,Process.Responding属性仅适用于具有UI的程序(我要启动的进程是控制台应用程序)。
我还查看了进程提供的各种事件,但没有一个在崩溃时触发。
有什么好的想法吗?
尝试将以下注册表值设置为DWORD 2:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode = 2
这将影响机器上的每个进程。
如果您拥有崩溃程序的源代码,可以通过捕获所有结构化异常并退出而不弹出消息框来防止弹出窗口。如何执行此操作取决于所使用的编程语言。
如果没有源代码,请在父级中使用SetErrorMode函数来抑制弹出窗口。错误模式会被子进程继承。为使其生效,您必须将UseShellExecute设置为false:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace SubProcessPopupError
{
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern int SetErrorMode(int wMode);
static void Main(string[] args)
{
int oldMode = SetErrorMode(3);
Process p;
ProcessStartInfo ps = new ProcessStartInfo("crash.exe");
ps.UseShellExecute = false;
p = Process.Start(ps);
SetErrorMode(oldMode);
p.WaitForExit();
}
}
}
如果您收到一个对话框,显示"是否要使用所选的调试器进行调试?",您可以通过将此注册表值设置为0来关闭它。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto = 0
不过,如果您已经按上面所述将错误模式设置为3,则我认为这种情况不会出现。
WaitForExit
调用之后的finally块中恢复原始值。 - BrainSlugs83Debugger.Launch
命令吗?- 这将打开你提到的对话框。 - BrainSlugs83