关机前关闭程序

时间:2014-07-07 00:21:50

标签: c# windows shutdown

我正在为公司编写程序,我为供应商编写了一个程序。 不幸的是,其中一位IT经理看到,员工在关闭计算机之前没有关闭这个程序,他告诉我你的应用程序必须在关闭之前自行关闭。我告诉他,这不是问题,Windows关闭了这个程序,但他说我不想看(Windows [windows等待后台程序关闭])。

在此之后我找到了这段代码:

        static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
    {
        switch (e.Reason)
        {
            case SessionEndReasons.Logoff:
                Application.Exit();
                break;

            case SessionEndReasons.SystemShutdown:
                Application.Exit();
                break;
        }
    }

然后将其添加到Form_Load:

            SystemEvents.SessionEnding += SystemEvents_SessionEnding;

如果你在Application.Exit()之前写了一个消息框,它会毫无问题地显示它,但是它没有工作,我可以看到(窗口等待后台程序关闭)。

为什么?我的代码有问题吗?!还有另一种方式吗?

感谢

2 个答案:

答案 0 :(得分:1)

正如这篇文章Is there a way in c# to detect a Windows shutdown/logoff and cancel that action (after asking the user)所说,似乎无法暂停超时问题。

也许您可以尝试MSDN SessionEnding中的示例:

private static int WM_QUERYENDSESSION = 0x11;
private static bool systemShutdown = false;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg==WM_QUERYENDSESSION)
    {
        MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot");
        systemShutdown = true;
    }

    // If this is WM_QUERYENDSESSION, the closing event should be
    // raised in the base WndProc.
    base.WndProc(ref m);

} //WndProc 

private void Form1_Closing(
    System.Object sender, 
    System.ComponentModel.CancelEventArgs e)
{
    if (systemShutdown)
        // Reset the variable because the user might cancel the 
        // shutdown.
    {
        systemShutdown = false;
        if (DialogResult.Yes==MessageBox.Show("My application", 
            "Do you want to save your work before logging off?", 
            MessageBoxButtons.YesNo))
        {
            e.Cancel = true;
        }
        else
        {
            e.Cancel = false;
        }
    }
}

Shutdown Changes for Windows Vista可能会为关机超时提供更多信息

答案 1 :(得分:0)

尝试Environment.Exit(0);而不是Application.Exit();