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-formclose

taskmanager を使用してアプリケーションを「強制終了」すると、イベントは発生しません. 単に実行を停止します. これがフリーズしたアプリケーションを閉じる方法です. イベントを処理するのを待っていた場合は、まだ凍結されています。

コンピューターを再起動したりシャットダウンしたりすると、十分な時間がある場合にのみイベントが呼び出されます。システムはすべてのアプリケーションにシャットダウンしていることを通知し、それらを殺す前にビジネスを処理するための短い時間を与えます。Windows 7 は、どのアプリケーションがまだビジーであるかを知らせるダイアログを表示し、それらを強制終了してシャットダウンするか、キャンセルするかを尋ねます。しかし、XPに関しては、X秒後にそれらを殺すだけです。

それは、FormClosing の動作を想像していた方法とほぼ同じです... Application.ApplicationExit イベントは、リッスンするのに適したイベントでしょうか?

于 2012-05-21T13:46:57.407 に答える
1

FormClosing イベントのプロパティに関する役立つ情報を次に示します。

FormClosingEventArgs.CloseReason のバグ?

そして、次のように switch ステートメントを使用してみることができます: フォームを閉じる理由を検出する

于 2012-05-21T13:47:07.797 に答える
0

最初に確認する必要があり、今は自分のマシンの前にいないため、動作するかどうかわかりません..しかし、CloseReason列挙型の他の要素も試しましたか? TaskManagerClosing を試してください。いずれにせよ、最初にメッセージ( messagebox )をスローして、実際に必要な正しい CloseReason があるかどうかを確認してください。また、チェックするたびにPCを閉じたくない場合は、 e.Cancel = true を使用することを忘れないでください。その後、ファイルへの書き込み方法が正しいかどうかを確認してください。

たぶん、これは アプリを閉じるときにユーザーに保存するように促すのにも役立ちます

于 2012-05-21T13:47:18.863 に答える