2016-07-23 8 views
0

Ich verwende den folgenden Code taskkill auf meinem Prozess zu handhaben:Führt Windows/f Prozesse beim Herunterfahren aus?

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
private class TestMessageFilter : IMessageFilter 
{ 
    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == /*WM_CLOSE*/ 0x10) 
     { 
      MessageBox.Show("I'm shutting down"); 
      var mailService = new MailService(); 
      mailService.SendEmail("Test from application exit"); 
      //Application.Exit(); 
      return true; 
     } 
     return false; 
    } 
} 

und dann

static void Main(string[] args) 
{ 
    Application.AddMessageFilter(new TestMessageFilter()); 
    Application.Run(); 
} 

Die MessageBox erscheint und die E-Mail gesendet wird, wenn ich taskkill /im MyProcess.exe tun. Dies geschieht jedoch nicht beim Herunterfahren von Windows.

Führt Windows beim Herunterfahren zwangsweise Prozesse aus oder fehlt mir etwas?

Antwort

1

Dass Sie WM_CLOSE überhaupt in einem IMessageFilter sehen können, ist ziemlich zufällig und ein Implementierungsdetail von taskkill.exe. Normalerweise sehen Sie nur gepostet Nachrichten, WM_CLOSE wird normalerweise gesendet. Ich denke, Sie sehen taskkill.exe zunächst versuchen, schön zu fragen, nur mit dem Vorschlaghammer, wenn die App nicht schnell genug reagiert. Der Task-Manager hat dies auch getan, aber in späteren Windows-Versionen nicht mehr.

Und nein, es kann sicherlich nicht bei einem Windows-Shutdown funktionieren. Es sendet eine WM_QUERYENDSESSION Nachricht an ein Fenster, um das Herunterfahren anzukündigen.

Viele gute Gründe, dies zu einem Service zu machen. Aber solange Sie es so machen wollen, brauchen Sie ein Fenster, um diese Nachricht zu sehen. Wenn Sie das FormClosing-Ereignis abonnieren, informiert Sie die e.CloseReason-Eigenschaft darüber, warum sie geschlossen wird. Sie sehen CloseReason.WindowsShutDown. Sie müssen das Fenster nur unsichtbar halten, damit es dem entspricht, was Sie haben, und überschreiben Sie die SetVisibleCore() -Methode wie in this post gezeigt.

0

Die allgemeine Verwendung von Pattern-Betriebssystemen besteht darin, anzufordern, dass laufende Prozesse ordnungsgemäß beendet werden, und sie dann zu beenden, wenn sie nicht innerhalb eines Zeitlimits enden. Bei einigen Anwendungen wird beim Herunterfahren eine Aufforderung zum Speichern von Änderungen angezeigt, die dem Benutzer jedoch möglicherweise nicht angezeigt wird. Windows kann einen Bildschirm "Herunterfahren" anzeigen und sagen, dass einige Prozesse noch ausgeführt werden. Möchten Sie sie trotzdem beenden und herunterfahren? ?

Ich glaube, wenn Sie Windows Forms verwenden, können Sie das gleiche Ergebnis wie hier mit den Closing/Closed Events * erreichen, so dass Sie sehen können, wenn einer der beiden ausgelöst wird, indem Sie Text in einer Datei speichern Spülen Sie es), und sehen Sie auch, ob Sie in PreFilterMessage andere Nachrichtencodes auf die gleiche Weise erhalten.

* Sie können entweder Closing oder Closed oder beide erhalten, also überprüfen Sie beide. z.B. Sie können ein Closed ohne vorherigen Closing erhalten.

+0

Gut. Keine Windows Forms .. –

Verwandte Themen