SystemEvents.SessionEnding not firing

本文关键字:firing not SessionEnding SystemEvents | 更新日期: 2023-09-27 18:10:48

我正在c# .net 4.0中开发一个windows窗体应用程序。我想捕获windows下线事件。

代码如下:

public Form1()
{
    InitializeComponent();
    SystemEvents.SessionEnding += (s, e) =>
    {
        if (e.Reason == SessionEndReasons.Logoff)
        {
            MessageBox.Show("LogOff");
        }
        else if (e.Reason == SessionEndReasons.SystemShutdown)
        {
            MessageBox.Show("ShutDown");
        }
    };
}

为什么我的sessionEnding没有被触发?

SystemEvents.SessionEnding not firing

  1. 这取决于gpedit.msc上的配置。

gpedit开放。在"计算机配置>管理模板>系统>关机选项"中选择"关闭自动终止阻止或取消关机的应用程序"。因为我的笔记本电脑配置为自动关机,所以它永远不会触发会话结束

  1. 也许您可以将上面的代码移动到其窗口的入口点(在主程序中)。

  2. 也许你可以重写windows消息。你可以在MSDN库文档中看到它。http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.sessionending.aspx

  3. 关闭消息泵已被其他软件重新路由,而不是重新路由到您的应用程序

这可能对某人有用。

如果包含表单关闭事件

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = true;
    }

那么SessionEnding将不会被触发,我刚刚遇到这个问题并纠正了它

void SystemEvents_SessionEnding(object sender, Microsoft.Win32.SessionEndingEventArgs e)
    {}

这里我需要防止Alt+F4命令关闭表单,所以我添加了这个表单关闭事件,这导致了这个问题。因此,我们可以将会话结束事件集成到窗体关闭事件中。选项2引用自stackoverflow答案