C# 终止应用程序之前的操作

C# 终止应用程序之前的操作,c#,.net,windows,winforms,C#,.net,Windows,Winforms,我正在开发一个独立的应用程序,需要在用户注销系统时执行一些操作(确切地说,我需要在某个URL上发布一些请求) 我曾尝试使用Application.ApplicationExit和AppDomain.CurrentDomain.ProcessExit事件或析构函数来实现这一点,但这些似乎都不起作用 如果能给我一些关于如何做的提示,我将不胜感激 以下是我的主要函数的一些片段: [STAThread] static void Main() { ... Application.Enab

我正在开发一个独立的应用程序,需要在用户注销系统时执行一些操作(确切地说,我需要在某个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 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。Thx.

如果没有任何代码外观的指示,这将太宽泛。添加更多详细信息,使您的问题不会结束。由于
main
方法的最后几行,“用户注销”有很多含义,但很少用于WinForms,因此您不能做任何您想做的事情,这有什么原因吗。。。你介意澄清一下吗?如果“注销”==“应用程序退出”比这更像是希望的复制品,那么这次更清楚到底发生了什么?文件是否未创建?你能在
应用程序\u ApplicationExit
中设置一个断点吗?但是我不想要一个可见的表单。
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();
    }
}