我正在 .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 对话框并阻止应用程序继续执行,直到我单击关闭。
我知道我可以将 HKLM\Software\Microsoft\Windows\Windows Error Reporting\
值禁用设置为 true - msdn.microsoft.com/en-us/library/bb513638%28v=vs .85%29.aspx
但是有没有办法可以在代码中做到这一点?
编辑:
kmp 已经发布了一个很好的答案,但我仍在寻找如何使用 native 应用程序实现相同的目标。
最佳答案
如果您可以编辑崩溃进程的代码,那么您可以做的就是添加如下所示的代码(本文讨论它: Disabling the program crash dialog ) - 请参阅 SetErrorMode function有关此 Windows API 函数的 MSDN 信息。
如果您无法更改崩溃应用程序的代码,那么它会更加复杂,您必须在运行时将代码注入(inject)其中(复杂程度取决于您正在启动的进程是用什么编写的 - 如果它是 .NET 进程)例如,它比 native 应用程序更容易,因此您需要提供有关该过程的更多信息)。
[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);
关于.net - 以编程方式禁用 Windows 错误报告 (AppCrash) 对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102982/