0

关闭 Windows 窗体应用程序时出现问题。我需要知道private void Form1_FormClosing(object sender, FormClosingEventArgs e)如果我按下表单上的X按钮并且我只是单击以关闭计算机,它是否总是被调用?

任何人都不会像往常一样关闭这个时间形式。我现在总是有屏幕可以按End

当表单关闭时,我已经连接到数据库,并将一些记录复制到另一个数据库。这可能是问题吗?表单快到快了,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

任何人都不会像往常一样关闭这个时间形式。我现在总是有屏幕可以按 End

您是说您希望应用程序在计算机重新启动或关闭时自动关闭吗?

如果是这样,只需将事件连接到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 回答