所以我有一个 C++ dll,在我的 C# 应用程序中使用它来监视 Windows 消息。我想知道 WM_CLOSE 和 WM_QUERYENDSESSION 是否已发送,因为我无法从 C# 应用程序中看到它们。如果我收到这些消息之一,我想对我的文件进行一些清理,但问题是当我用 TM 杀死它时,功能不起作用。看来我没有收到消息。我认为问题在于任务管理器向 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 而不是 ExitProcess,则动态链接库 (DLL) 维护的全局数据的状态可能会受到损害。
这个功能停止进程内所有线程的执行并请求取消所有待处理的 I/O...
编辑:Hans Passant 对任务终止方式的评论 - 当使用任务管理器中的“应用程序”选项卡时,您只会收到 WM_CLOSE。从“进程”选项卡中终止它是一种粗鲁终止(TerminateProcess)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)