Обработка выключения системы в WPF - PullRequest
4 голосов
/ 17 июля 2009

Как я могу переопределить WndProc в WPF? Когда мое окно закрывается, я пытаюсь проверить, был ли изменен файл, который я использую, и если да, я должен запросить у пользователя «Вы хотите сохранить изменения?» сообщение, затем закройте используемый файл и окно. Однако я не могу обработать случай, когда пользователь перезапускает / shutdown / logoff, когда мое окно все еще открыто. Я не могу переопределить WndProc, так как я разрабатываю с использованием WPF. 1001 * этот образец кода MSDN . Это то, что я сделал private voidloadedForm (отправитель объекта, RoutedEventArgs e) {

  HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
  source.AddHook(new HwndSourceHook(WndProc));

}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{


 if (msg == WM_QUERYENDSESION.)
 {
  OnWindowClose(this, new CancelEventArgs())
  handled = true;
  shutdown = true;
 }  
 return IntPtr.Zero;    
}
private void OnWindowClose(object sender, CancelEvetArgs e)
{
   if (modified)
   {
     //show message box
     //if result is yes/no
       e.cancel = false;
     //if cancel
        e.cancel = true;
   }

}

В файле XAML я также использовал Closing = "OnWindowClose", однако, когда я нажимаю да / нет, ничего не происходит, мое приложение не закрывается. и если я попытаюсь закрыть его снова с помощью кнопки закрытия, я получу ошибку? почему это так? это из-за Крюка ?? Что эквивалентно этому в WPF?

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)
    {
        systemShutdown = true;
    }

    // If this is WM_QUERYENDSESSION, the closing event should be
    // raised in the base WndProc.
    base.WndProc(m);

} //WndProc 

private void Form1_Closing(
    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))
        {
            SaveFile();
            e.Cancel = false;
        }
        else{
            e.Cancel = true;
        }
        CloseFile();
    }
}

1 Ответ

6 голосов
/ 17 июля 2009

Почему бы не использовать событие Application.SessionEnding ? Похоже, это сделано для того, чтобы делать то, что вы хотите, и вам не нужно обрабатывать сообщения Windows напрямую.

Вы можете установить Cancel в true на SessionEndingCancelEventArgs, если хотите отменить выключение.

...