0

Windowsフォームアプリケーションを閉じるときに問題が発生します。フォームのXprivate void Form1_FormClosing(object sender, FormClosingEventArgs e)ボタンを押した場合、およびクリックしてコンピュータをシャットダウンした場合に、常に呼び出されることを知っておく必要がありますか?

この時間のどちらのフォームも通常どおり閉じられません。私はいつも終了を押す画面を持っています

フォームが閉じているときにデータベースに接続し、一部のレコードを別のデータベースにコピーしています。それは多分問題ですか?フォームが高速に近づいていて、SQLコマンドを終了できませんか?

私は試しましたEnviroment.Exit(0)Application.Exit()。何も正しく機能していないようです。

すべてのSQLを実行してから終了する方法は?

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //close database connection
            if (Con.State == ConnectionState.Open)
                Con.Close();
            info.Dispose();

            //last check for local database
            try
            {
               // database queries and so on....

            }
            catch (Exception ex)
            {
                writeToLogFile(ex.Message);
            }
            // exit
            Environment.Exit(0);
        }
4

2 に答える 2

1

更新(最後のコメントに基づく):

private const int WM_QUERYENDSESSION = 0x11;
private const int WM_CANCELMODE = 0x1f;
private bool shutdownRequested = false;

...

protected override void WndProc(ref Message ex)
{
    if (ex.Msg == WM_QUERYENDSESSION)
    {
        Message MyMsg = new Message();
        MyMsg.Msg = WM_CANCELMODE;
        base.WndProc(ref MyMsg);
        this.shutdownRequested = true;
    }
    else
    {
        base.WndProc(ex);
    }
}

...

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    this.Visible = false; // optional
    this.ShowInTaskbar = false; // optional
    Task db = Task.Factory.StartNew(() => DBUpdate();
    Task.WaitAll(db); // you can have more tasks like the one above
    if (this.shutdownRequested)
        Process.Start("shutdown.exe","-s");
}

private void DBUpdate()
{
    // write your db code here
}

これでうまくいくと思います。

于 2012-06-16T15:33:18.010 に答える
0

この時間のどちらのフォームも通常どおり閉じられません。私はいつも終了を押す画面を持っています

コンピュータが再起動またはシャットダウンされた場合にアプリケーションを自動的にシャットダウンするように言っていますか?

その場合は、イベントをMicrosoft.Win32.SystemEvents.SessionEndingイベントに接続するだけです。

Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(SystemEvents_SessionEnding);

void SystemEvents_SessionEnding(object sender, Microsoft.Win32.SessionEndingEventArgs e)
    {
        // Run your application shut down code here...
    }
于 2012-06-16T16:38:37.903 に答える