1

我的计算机有一个备用电源,它与计算机和墙壁串联。当我从墙上拔下电源线时,备用电源会在 2-5 分钟后关闭计算机。正是在这段时间内,我想使用以下代码将数据写入文件:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
    {
        writeContents("Interrupted");
        sendMessage("PWR - The Spring Test Machine has stopped");                
        return;
    }

    if (e.CloseReason.Equals(CloseReason.UserClosing)) 
    {
        if (MessageBox.Show("You are closing this application.\n\nAre you sure you wish to exit ?", "Warning: Not Submitted", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Stop) == DialogResult.Yes)
        {
            writeContents("Interrupted");
            return;
        }
        else
            e.Cancel = true; 
    } 
}

问题是它没有用。我认为闭幕式的活动从来没有被调用过。任何想法将不胜感激。谢谢你。

4

3 回答 3

3

从这里http://www.daniweb.com/software-development/csharp/threads/253249/application-exit-does-not-trigger-the-formclosing

当您使用任务管理器“杀死”应用程序时,它不会触发任何事件,它只是停止执行,这就是您关闭已冻结的应用程序的方式。如果您等待它处理任何事件,那么它仍然会被冻结。

至于当您重新启动计算机或关闭时,只有在有足够的时间时才会调用该事件,它们系统会告诉所有应用程序它正在关闭,并且只给它们很短的时间来处理业务,然后才会杀死它们。Windows 7 将显示一个对话框,告诉您哪些应用程序仍然很忙,并询问您是否要杀死它们并关闭或取消。但是对于 XP,它只会在 X 秒后杀死它们。

这几乎就是我想象 FormClosing 的行为的方式...... Application.ApplicationExit Event 会是一个更好的监听事件吗?

于 2012-05-21T13:46:57.407 回答
1

以下是有关 FormClosing 事件属性的一些有用信息:

FormClosingEventArgs.CloseReason 中的错误?

您可以尝试使用 switch 语句,如下所示: 检测表单关闭的原因

于 2012-05-21T13:47:07.797 回答
0

不确定它是否有效,因为我需要先检查它,而且我现在不在我的机器前.. 但是您是否也尝试过 CloseReason 枚举的其他元素?尝试 TaskManagerClosing 。在任何情况下,首先尝试抛出一个消息(消息框),看看你是否真的有你想要的正确 CloseReason 并且如果你不希望每次检查时都关闭电脑,也不要忘记使用 e.Cancel = true 。之后检查您写入文件的方法是否正常。

也许这也有助于 在关闭应用程序时提示用户保存

于 2012-05-21T13:47:18.863 回答