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

本文关键字:什么 消息 我的 任务管理器 程序 | 更新日期: 2023-09-27 18:35:10

所以我有一个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();

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

您的进程在被终止的情况下将不会收到任何消息。从终止进程开始 - 请参阅我的亮点:

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

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

编辑:Hans Passant评论任务终止的方式 - 只有在使用任务管理器中的"应用程序"选项卡时,您才会得到WM_CLOSE。从"进程"选项卡中杀死它是一个粗鲁的终止(终止进程)。