当我用任务管理器杀死我的程序时,我收到了什么消息

所以我有一个C ++ DLL,我在我的c#应用程序中用于监视Windows消息。 我想知道是否发送了WM_CLOSE和WM_QUERYENDSESSION,因为我无法从C#应用程序中看到它。 如果我收到其中一条消息,我想用我的文件做一些清理,但问题是当我用TM杀死它时function不起作用。 它接缝我没有得到消息。 我认为问题是任务管理器向C#应用程序发送消息而不是c ++ dll。

一些代码:

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

如果它被杀死,您的进程将不会收到任何消息。 从TerminateProcess开始 – 请看我的亮点:

TerminateProcess函数用于无条件地导致进程退出。 如果使用TerminateProcess而不是ExitProcess,则动态链接库(DLL)维护的全局数据的状态可能会受到影响。

此函数停止执行进程中的所有线程并请求取消所有挂起的I / O …

编辑:Hans Passant对方法任务终止的评论 – 在任务管理器中使用“应用程序”选项卡时,只能获得WM_CLOSE。 从“进程”选项卡中杀死它是一个粗鲁的终止(TerminateProcess)。