SystemEvents.SessionEnding未触发

时间:2011-10-06 18:32:54

标签: c# .net visual-studio-2010

我正在使用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没有被解雇?

2 个答案:

答案 0 :(得分:2)

  1. 这取决于gpedit.msc上设置的配置。
  2. 打开gpedit.msc,导航到计算机配置>管理模板>系统>关闭选项并选择关闭阻止或取消关闭的应用程序的自动终止。由于我的笔记本电脑配置使其自动关闭,因此它永远不会触发会话结束

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

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

    3. 关闭消息泵已被其他软件重新路由,无法重新路由到您的应用

答案 1 :(得分:1)

这可能对某人有用。

如果包含表格关闭事件

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

然后不会触发SessionEnding,我只是遇到了这个问题并纠正了它

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

这里我需要阻止Form关闭Alt + F4命令,所以我添加了这个表单关闭事件,这导致了这个问题。所以我们可以在表单关闭事件中集成会话结束事件。 Refered from stackoverflow answer

中的选项2