终止应用程序前的操作
Action before terminating app
我正在开发一个独立的应用程序,需要在用户注销系统时执行一些操作(我确实需要 post 对某些 URL 进行一些请求)..
我曾尝试使用 Application.ApplicationExit
和 AppDomain.CurrentDomain.ProcessExit
事件或析构函数来实现此目的,但似乎都不起作用。
如能提供有关操作方法的提示,我将不胜感激。
这是我的主要功能的一些片段:
[STAThread]
static void Main()
{
...
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ApplicationExit += Application_ApplicationExit;
AppDomain.CurrentDomain.ProcessExit += Application_ApplicationExit;
Application.Run();
}
static void Application_ApplicationExit(object sender, EventArgs e)
{
File.Create("C:\kod\test5.txt");
}
我正在尝试通过创建文件来测试此行为(更容易看到结果)。
希望这次会更清楚。
要使您的 Windows 表单可见,您需要在 Application.Run() 方法中传递表单对象。
Application.Run();
。
Application.Run 方法:在当前线程上开始 运行 标准应用程序消息循环,没有表单。
传递表单以使其可见。
Application.Run Method (Form)
好的。根据你们的一些建议,我想出了一个令人满意的解决方案。
我创建了一个最小化的,不在任务栏窗体中显示(所以它对用户不可见)并被覆盖
当我 运行 关于 WM_QUERYENDSESSION
和 WM_ENDSESSION
消息的一些代码时的 WndProc。
还有一些代码:
public class BlockingForm : Form
{
public delegate void SessionEnd();
public event SessionEnd SessionEndEvent;
public BlockingForm()
{
WindowState = FormWindowState.Minimized;
ShowInTaskbar = false;
}
protected override void WndProc(ref Message aMessage)
{
const int WM_QUERYENDSESSION = 0x0011;
const int WM_ENDSESSION = 0x0016;
if (aMessage.Msg == WM_QUERYENDSESSION || aMessage.Msg == WM_ENDSESSION)
{
OnSessionEnd();
}
base.WndProc(ref aMessage);
}
private void OnSessionEnd()
{
var handler = SessionEndEvent;
if (handler != null) handler();
}
}
最有帮助的评论来自@Sinatr。谢谢
我正在开发一个独立的应用程序,需要在用户注销系统时执行一些操作(我确实需要 post 对某些 URL 进行一些请求)..
我曾尝试使用 Application.ApplicationExit
和 AppDomain.CurrentDomain.ProcessExit
事件或析构函数来实现此目的,但似乎都不起作用。
如能提供有关操作方法的提示,我将不胜感激。
这是我的主要功能的一些片段:
[STAThread]
static void Main()
{
...
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ApplicationExit += Application_ApplicationExit;
AppDomain.CurrentDomain.ProcessExit += Application_ApplicationExit;
Application.Run();
}
static void Application_ApplicationExit(object sender, EventArgs e)
{
File.Create("C:\kod\test5.txt");
}
我正在尝试通过创建文件来测试此行为(更容易看到结果)。
希望这次会更清楚。
要使您的 Windows 表单可见,您需要在 Application.Run() 方法中传递表单对象。
Application.Run();
。 Application.Run 方法:在当前线程上开始 运行 标准应用程序消息循环,没有表单。
传递表单以使其可见。
Application.Run Method (Form)
好的。根据你们的一些建议,我想出了一个令人满意的解决方案。
我创建了一个最小化的,不在任务栏窗体中显示(所以它对用户不可见)并被覆盖
当我 运行 关于 WM_QUERYENDSESSION
和 WM_ENDSESSION
消息的一些代码时的 WndProc。
还有一些代码:
public class BlockingForm : Form
{
public delegate void SessionEnd();
public event SessionEnd SessionEndEvent;
public BlockingForm()
{
WindowState = FormWindowState.Minimized;
ShowInTaskbar = false;
}
protected override void WndProc(ref Message aMessage)
{
const int WM_QUERYENDSESSION = 0x0011;
const int WM_ENDSESSION = 0x0016;
if (aMessage.Msg == WM_QUERYENDSESSION || aMessage.Msg == WM_ENDSESSION)
{
OnSessionEnd();
}
base.WndProc(ref aMessage);
}
private void OnSessionEnd()
{
var handler = SessionEndEvent;
if (handler != null) handler();
}
}
最有帮助的评论来自@Sinatr。谢谢