2016-01-22 4 views
1

Я выполняю эти примеры кодов на MSDN, чтобы предотвратить окна 7 от остановки до пользователя подтверждения:Возврат FALSE в WM_QUERYENDSESSION не может предотвратить Windows7 от остановки

private static int WM_QUERYENDSESSION = 0x11; 
    private static bool systemShutdown = false; 
    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (m.Msg == WM_QUERYENDSESSION) 
     { 
      MessageBox.Show("queryendsession: 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); 

    } //WndProc 

    private void Form1_FormClosing(System.Object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     if (systemShutdown) 
     // Reset the variable because the user might cancel the 
     // shutdown. 
     { 
      systemShutdown = false; 
      if (DialogResult.Yes == MessageBox.Show("My application", 
       "Do you want to save your work before logging off?", 
       MessageBoxButtons.YesNo)) 
      { 
       e.Cancel = true; 
      } 
      else 
      { 
       e.Cancel = false; 
      } 
     } 
    } 

Но проблема я столкнулся на одном компьютере, даже если отображается «queryendsession: это выход из системы, завершение работы или перезагрузка» (поэтому получен WM_QUERYENDSESSION), Windows 7 не дождалась подтверждения и выключения пользователя. На других ПК эти коды работают хорошо. Поэтому мне интересно, что происходит. Большое спасибо.

Btw: Я попытался напрямую отправить e.Cancel = false в Form1_FormClosing, но ничего не произошло. Выключение системы и ожидания не было.

+0

дней, что программы могут блокировать отключение закончено, и сделано с. Отображение окна сообщений - это плохая идея, пользователь не может добраться до нее, чтобы щелкнуть ее. Обратите внимание на свойство e.CloseReason в обработчике событий FormClosing, если машина выключается, вам придется сделать предположение. Немногие пользователи любят потерять работу. –

+0

Спасибо, что напомнили мне, чтобы проверить причину. Причина в том, что системное решение одинаково для всех тестируемых ПК. Но только тот, который упоминается выше, немедленно выключится независимо от того, что вы делаете с e.Cancel. –

ответ

0

Это, как я сделал это в последний раз, когда я хотел, чтобы предотвратить окно от остановки:

Public Form1() 
{ 
    InitializeComponent(); 

    SystemEvents.SessionEnding += SessionEndingEvtHandler;   
} 

private void SessionEndingEvtHandler(object sender, SessionEndingEventArgs e) 
{ 
    e.Cancel = true; 
} 
+0

Большое спасибо за ваш добрый ответ. Но это решение тоже не работает: ничего не произошло, и система отключилась. Я начинаю сомневаться, что это связано с неправильной конфигурацией системы. –