5

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

1 回答 1

3

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

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

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

编辑:Hans Passant 关于任务终止方式的评论 - 在任务管理器中使用“应用程序”选项卡时,您只会获得 WM_CLOSE。从 Processes 选项卡中杀死它是一种粗鲁的终止 (TerminateProcess)。

于 2012-05-22T16:51:32.053 回答