2012-05-22 7 views
5

killt Also habe ich eine C++ - DLL, die ich in meiner C# -Anwendung verwende, um Windows-Nachrichten zu überwachen. Ich möchte wissen, ob WM_CLOSE und WM_QUERYENDSESSION gesendet werden, da ich das aus einer C# -Anwendung nicht sehen kann. Wenn ich eine dieser Nachrichten bekomme, möchte ich mit meinen Dateien etwas aufräumen, aber das Problem ist, wenn ich es mit TM abbringe funktionieren die Funktionen nicht. Es scheint, dass ich die Nachrichten nicht bekomme. Ich denke, das Problem ist, dass der Task-Manager eine Nachricht an die C# -App und nicht an die C++ - DLL sendet.Welche Nachricht erhalte ich, wenn ich mein Programm mit dem Taskmanager

Einige Code:

C++:

typedef void (*CLOSING_FUNCTION)(); 
CLOSING_FUNCTION myClosingFunction; 

typedef void (*SHUTDOWN_FUNCTION)(); 
SHUTDOWN_FUNCTION myShutdownFunction; 

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 

    case WM_CREATE: 
     return 0; 

    case WM_CLOSE: 
     myClosingFunction(); 
     return 0; 

    case WM_QUERYENDSESSION: 
     myShutdownFunction(); 
     return 1; 

    case WM_DESTROY: 
     myClosingFunction(); 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

C#:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void Close_Function(); 
private static Close_Function myCloseDelegate; 

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void Shutdown_Function(); 
private static Shutdown_Function myShutdownDelegate; 
static void StartMonotoring() 
{ 
     myCloseDelegate = Close; 
     myShutdownDelegate = Shutdown; 

     InterceptMessages(myCloseDelegate, myShutdownDelegate); 
} 

static void Close(); 
static void Shutdown(); 
+2

Sie erhalten WM_CLOSE nur, wenn Sie die Registerkarte Anwendungen im Task-Manager verwenden. Es ist eine unhöfliche Beendigung, wenn Sie es auf der Registerkarte "Prozesse" löschen. Wie die Nachricht im C++ - Code endet, ist sehr unklar. Die Benutzeroberfläche wird normalerweise in C# erstellt. –

+2

Oder Sie erhalten ein Ereignis "CTRL_CLOSE_EVENT" in Konsolenanwendungen. Obligatorischer Link zum relevanten oldnewthing [Blogbeitrag] (http://blogs.msdn.com/b/oldnewthing/archive/2004/07/22/191123.aspx) –

Antwort

3

Ihr Prozess keine Nachrichten für den Fall, wenn es getötet wird. Start auf TerminateProcess - siehe meine Hervorhebung:

Die Funktion TerminateProcess wird verwendet, um bedingungslos einen Prozess zu beenden. Der Status globaler Daten, die von Dynamic Link Libraries (DLLs) verwaltet werden, kann beeinträchtigt werden, wenn TerminateProcess anstelle von ExitProcess verwendet wird.

Diese Funktion Ausführung aller Threads innerhalb des Prozesses stoppt und fordert Löschung aller ausstehenden I/O ...

EDIT: Hans Passant Kommentar über Art und Weise Aufgaben beendet - Sie WM_CLOSE nur erhalten, wenn mit die Registerkarte Anwendungen im Task-Manager. Es ist eine unhöfliche Beendigung (TerminateProcess) von der Registerkarte Prozesse zu töten.

+0

Und im Falle eines eingeleiteten Shutdown WM_QUERYENDSESSION? – Thanatos

+1

ja. Nebenbemerkung zum Task-Manager: Ich denke, es gibt Fälle, in denen der Task-Manager versucht, den Prozess vor dem Beenden ordnungsgemäß anzuhalten, aber ich würde nur erwarten, dass TerminateProcess für den Prozess verwendet wird, wenn es für Sie wichtig ist. –

+0

Dann wissen Sie einen Weg, um herauszufinden, ob das Herunterfahren mit C# eingeleitet wurde? In winapi habe ich das Query-Ende verwendet, aber hier? – Thanatos

Verwandte Themen