如何防止显示“程序意外终止”窗口?

时间:2012-05-19 12:42:51

标签: c# .net windows

我有一个使用AciveX对象并提供WCF服务的C#WPF程序。所以有许多线程,许多调用非托管代码。有时在满载应用程序崩溃。我正在研究这个问题 - 看起来问题出现在ActiveX中,我无法改变。无论如何我需要一种方法来在崩溃后恢复程序。至于现在我找到了解决方案:

public partial class App : Application
 {
    private static readonly Logger log = LogManager.GetCurrentClassLogger();

    bool isClosing = false;


    [System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute]
    void D_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        log.FatalException("Error UnhandledException ", (Exception)e.ExceptionObject);
        MonitoringSvc.host.Close();
        log.Info("Restarting");
        if (!isClosing)
        {

            System.Windows.Forms.Application.Restart();
            System.Windows.Application.Current.Shutdown();
        }
    }


    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain D = AppDomain.CurrentDomain;
        D.UnhandledException += new UnhandledExceptionEventHandler(D_UnhandledException);
    }

    private void Application_Exit(object sender, ExitEventArgs e)
    {
        isClosing = true;
    }
}

程序在未处理的异常时重新启动(模拟肯定)。但是旧的副本仍然没有关闭系统消息“程序意外终止”。程序不会与用户交互最多时间,因此没有人可以关闭该消息以关闭程序。问题是如何静静地关闭旧窗户?

1 个答案:

答案 0 :(得分:5)

以下是如何禁用程序崩溃时出现的窗口的解决方案。不仅是WET,因为即使使用WET禁用,也会显示其他窗口(要求关闭或调试程序)。

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern int SetErrorMode(int wMode);

    [DllImport("kernel32.dll")]
    static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
    public delegate bool FilterDelegate(Exception ex);

    App()
    {
        FilterDelegate fd = delegate(Exception ex)
        {
            return true;
        };
        SetUnhandledExceptionFilter(fd);

        SetErrorMode(SetErrorMode(0) | 0x0002 );
    }