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

.net 以编程方式禁用Windows错误报告(AppCrash)对话框,.net,.net,我正在.NET应用程序中执行一个进程 Process process = new Process(); .... process.StartInfo.UseShellExecute = false; process.StartInfo.ErrorDialog = false; process.StartInfo.CreateNoWindow = true;

我正在.NET应用程序中执行一个进程

                Process process = new Process(); 

....

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

                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
....
                process.Start();
问题是可执行文件有时会崩溃,这是正常的,但是AppCrash拨号会弹出,阻止应用程序继续执行,直到我单击close

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

但有没有一种方法可以在代码中实现这一点?

编辑:


kmp发布了一个很好的答案,但我仍在寻找如何在本机应用程序中实现同样的效果。

如果您可以编辑崩溃过程的代码,那么您可以做的就是添加下面所示的代码(本文讨论的是:)-有关此Windows API函数的MSDN信息,请参阅

如果您无法更改崩溃应用程序的代码,那么它将更加复杂,您必须在运行时将代码注入其中(这有多复杂取决于您启动的进程是用什么编写的——例如,如果它是.NET进程,则比本机应用程序更容易,因此您需要提供有关该进程的更多信息)


根据,应该可以将
SetErrorMode
值继承到子进程这将
SetErrorMode
设置为所需的值,然后执行您的本机应用程序。实际上,此inheritace默认存在。要关闭它,请参阅标志。

谢谢,但我无法更改崩溃过程。可执行文件是本机代码。此存档中可以找到应用程序gswin64c.exe:那么,知道我如何输入它吗将其插入本机应用程序?效果很好。在处理托管应用程序时,可能不需要注入。您可以创建一个包装器应用程序,该应用程序将设置这些标志,然后加载真正的应用程序集(不是新进程)并执行Program.Main()使用反射,但这只是一个想法,我没有测试它。为我工作。我使用了这个NativeMethods.SetErrorMode(ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);有没有办法在崩溃后重新启动我的应用程序?
[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);