2009-07-17 9 views
4

Comment puis-je remplacer WndProc dans WPF? Lorsque ma fenêtre se ferme, j'essaie de vérifier si le fichier que j'utilise a été modifié, si c'est le cas, je dois indiquer à l'utilisateur "Voulez-vous enregistrer les modifications?" message, puis fermez le fichier en cours d'utilisation et la fenêtre.Cependant, je ne peux pas gérer le cas lorsque l'utilisateur redémarre/shutdown/déconnecter lorsque ma fenêtre est encore ouverte.Je ne peux pas remplacer WndProc depuis que je développe en utilisant WPF.J'ai également essayé d'utiliser this sample MSDN code .C'est ce que je faisais loadedForm private void (object sender, RoutedEventArgs e) {Gestion de l'arrêt du système dans 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; 
    } 

} 

Sur le fichier XAML, j'ai aussi utilisé cependant rien Closing = "OnWindowClose" se produit lorsque je clique sur oui/non, mon application ne se ferme pas . et si j'essaye de le refermer en utilisant le bouton de fermeture, je reçois une erreur? Pourquoi cela est-il ainsi? est-ce à cause du Hook ?? Quel est l'équivalent dans 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(); 
    } 
} 

Répondre

6

Pourquoi ne pas utiliser l'événement Application.SessionEnding? Cela semble être conçu pour faire ce que vous souhaitez et vous n'aurez pas besoin de gérer le message Windows directement.

Vous pouvez définir Annuler sur true sur SessionEndingCancelEventArgs si vous souhaitez annuler l'arrêt.

+0

Je crois en WPF que vous devez utiliser 'SystemEvents.SessionEnding' – mgttlinger

Questions connexes