Отключить диалоговое окно отчетов об ошибках Windows (AppCrash)

Я выполняю процесс в приложении .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 Error Reporting\ значение Disabled значение true - msdn.microsoft.com/en-us/library/bb513638%28v=vs .85%29.aspx

Но есть ли способ, которым я могу это сделать в коде?

EDIT:

kmp отправил отличный ответ, но я все еще смотрю, как добиться этого с помощью собственного приложения.

Ответы

Ответ 1

Если вы можете отредактировать код процесса сбоя, то то, что вы можете сделать, это добавить код, как показано ниже (в этой статье говорится об этом: Отключение диалоговое окно сбоя программы) - см. функцию SetErrorMode для информации MSDN об этой функции Windows API.

Если вы не можете изменить код приложения сбойного кода, он более сложный, и вам придется вводить код в него во время выполнения (насколько сложный процесс зависит от того, на каком этапе запускается процесс - если это процесс .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);

Ответ 2

В соответствии с этот документ должно быть возможно наследовать значение SetErrorMode дочернему процессу. Поэтому любая работающая программа (или ваше основное приложение), которая будет SetErrorMode к требуемым значениям, а затем выполнить собственное приложение, должна работать. На самом деле это inheritace существует по умолчанию. Чтобы отключить его, см. Флаги здесь.