终止应用程序之前的操作

时间:2015-01-07 07:29:17

标签: c# .net windows winforms

我正在开发一个独立的应用程序,当用户登出系统时需要做一些操作(我需要在某些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");
}

我正在尝试使用创建文件来测试此行为(更容易看到结果)。

希望这次会更清楚。

2 个答案:

答案 0 :(得分:0)

要使Windows窗体可见,您需要在Application.Run()方法中传递Form对象。

Application.Run();

<击> Application.Run Method: Begins running a standard application message loop on the current thread, without a form.

传递表单以使其可见。

Application.Run Method (Form)

答案 1 :(得分:0)

确定。根据你们的一些建议,我想出了一个令人满意的解决方案。

我创建了一个最小化的,没有在任务栏表单中显示(因此它对用户是不可见的)并覆盖 我在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的评论。 THX。