所以我有一个C ++ dll,我在我的c#应用程序中用于监视Windows消息。我想知道是否发送了WM_CLOSE和WM_QUERYENDSESSION,因为我无法从C#应用程序中看到它。如果我收到其中一条消息,我想用我的文件做一些清理,但问题是当我用TM杀死它时功能不起作用。它接缝我没有收到消息。我认为问题是任务管理器向C#app发送消息而不是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();
答案 0 :(得分:3)
如果被杀,您的进程将不会收到任何消息。从TerminateProcess开始 - 请参阅我的重点:
编辑:Hans Passant对方法任务终止的评论 - 在使用任务管理器中的“应用程序”选项卡时,只能获得WM_CLOSE。从进程选项卡中杀死它是一个粗鲁的终止(TerminateProcess)。TerminateProcess函数用于无条件地导致进程退出。如果使用TerminateProcess而不是ExitProcess,则动态链接库(DLL)维护的全局数据状态可能会受到损害。
此函数停止执行流程中的所有线程,并请求取消所有待处理的I / O ...