2009-07-17 7 views
4

Как я могу переопределить WndProc в WPF? Когда мое окно закрывается, я пытаюсь проверить, был ли изменен файл, который я использую, если это так, мне нужно пропустить пользователя для «Хотите сохранить изменения?». сообщение, затем закройте используемый файл и окно. Однако я не могу обработать случай, когда пользователь перезагружается/выключается/выходит из системы, когда мое окно все еще открыто. Я не могу переопределить WndProc, поскольку я разрабатываю WPF. Я также пробовал использовать this sample MSDN code .Это что я сделал личное недействительным loadedForm (объект отправителя, RoutedEventArgs е) {Обработка выключения системы в WPF

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(); 
    } 
} 

ответ

6

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

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

+0

Я верю в WPF, вам нужно использовать 'SystemEvents.SessionEnding' – mgttlinger