繁体   English   中英

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

[英]What message I receive when I kill my program with task manager

所以我有一个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函数用于无条件地导致进程退出。 如果使用TerminateProcess而不是ExitProcess,则动态链接库(DLL)维护的全局数据的状态可能会受到影响。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM