终止应用程序前的操作

Action before terminating app

我正在开发一个独立的应用程序,需要在用户注销系统时执行一些操作(我确实需要 post 对某些 URL 进行一些请求)..

我曾尝试使用 Application.ApplicationExitAppDomain.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_QUERYENDSESSIONWM_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。谢谢