Как я могу определить, выключается ли система / перезагружается ли пользователь или вышел из приложения WinForms? - PullRequest
0 голосов
/ 09 марта 2011

Как узнать, какое действие выполнил пользователь, например, выключение, перезагрузка, ожидание, блокировка или выход из системы. Я использовал приведенный ниже код, чтобы проверить его, но я хочу идентифицировать каждый случай и выполнить соответствующее действие.

 private static int WM_QUERYENDSESSION = 0x11;
    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (m.Msg == WM_QUERYENDSESSION)
        {
            MessageBox.Show(m.Msg.ToString() + " Endsession: this is a logoff, shutdown, or reboot");
            systemShutdown = true;
        }
        // If this is WM_QUERYENDSESSION, the closing event should be
        // raised in the base WndProc.
        base.WndProc(ref m);
    }

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Вам необходимо проверить значение lParam сообщения WM_QUERYENDSESSION.

Как указано в документации :

  • Если параметр равен 0, система выключается или перезапускается (это невозможно определить какое событие происходит).

  • Если параметр ENDSESSION_CLOSEAPP (0x00000001), приложение использует файл, который необходимо заменить, система в настоящее время обслуживаются, или системные ресурсы истощены.

  • Если параметр ENDSESSION_CRITICAL (0x40000000), приложение вынуждено закрыть вниз.

  • Если параметр ENDSESSION_LOGOFF (0x80000000), затем пользователь выходит из системы.

3 голосов
/ 09 марта 2011
static void Main()
{
    Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(SystemEvents_SessionEnding);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

static void SystemEvents_SessionEnding(object sender, Microsoft.Win32.SessionEndingEventArgs e)
{
    // Do something
}

В SystemEvents может быть несколько других событий, которые могут вас заинтересовать.

...