以编程方式禁用Windows错误报告(AppCrash)对话框

use*_*362 16 .net

我正在执行.NET应用程序中的Process.

                Process process = new Process(); 

....

                process.StartInfo.UseShellExecute = false;
                process.StartInfo.ErrorDialog = false;

                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
....
                process.Start();
Run Code Online (Sandbox Code Playgroud)

问题是可执行文件有时会崩溃,这是可以的,但AppCrash拨号弹出并阻止应用程序继续执行,直到我点击关闭.

我知道我可以将HKLM\Software\Microsoft\Windows\Windows Error Reporting\值Disabled 设置为true - msdn.microsoft.com/en-us/library/bb513638%28v=vs.85%29.aspx

但有没有办法可以在代码中执行此操作?

编辑:

kmp发布了一个很好的答案,但我仍然在寻找如何使用本机应用程序实现相同的目标.

kmp*_*kmp 20

如果你可以编辑崩溃过程的代码,那么你可以做的就是添加我在下面显示的代码(本文讨论它:禁用程序崩溃对话框) - 请参阅SetErrorMode函数以获取有关此Windows API函数的MSDN信息.

如果你无法改变崩溃应用程序的代码,它就会变得更复杂,你必须在运行时将代码注入其中(这有多复杂取决于你正在启动的进程是什么 - 如果它是一个.NET进程,它会更容易例如,比本机应用程序,您需要提供有关该过程的更多信息).

[Flags]
internal enum ErrorModes : uint 
{
    SYSTEM_DEFAULT = 0x0,
    SEM_FAILCRITICALERRORS = 0x0001,
    SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
    SEM_NOGPFAULTERRORBOX = 0x0002,
    SEM_NOOPENFILEERRORBOX = 0x8000
}

internal static class NativeMethods
{
    [DllImport("kernel32.dll")]
    internal static extern ErrorModes SetErrorMode(ErrorModes mode);
}

// Ideally the first line of the main function...

NativeMethods.SetErrorMode(NativeMethods.SetErrorMode(0) | 
                           ErrorModes.SEM_NOGPFAULTERRORBOX | 
                           ErrorModes.SEM_FAILCRITICALERRORS | 
                           ErrorModes.SEM_NOOPENFILEERRORBOX);
Run Code Online (Sandbox Code Playgroud)


Ond*_*dra 5

根据此文档,应该可以将该SetErrorMode值继承给子进程。因此,任何类型的启动器(或您的主应用程序)都需要SetErrorMode所需的值,然后执行您的本机应用程序应该可以工作。实际上这个继承是默认存在的。要关闭它,请参阅此处的标志。