关闭Windows窗体应用程序时遇到问题。我需要知道,如果我在表单上按 X 按钮并且我只是点击关闭计算机,它总是被称为private 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);
}
答案 0 :(得分: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
}
我相信这会奏效。
答案 1 :(得分: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...
}