Вопрос по c#, winapi, dll – Какое сообщение я получаю, когда убиваю программу с помощью диспетчера задач

5

Итак, у меня есть C ++ dll, который я использую в своем приложении c # для мониторинга сообщений Windows. Я хочу знать, отправляются ли WM_CLOSE и WM_QUERYENDSESSION, потому что я не могу видеть это из приложения на C #. Если я получаю одно из этих сообщений, я хочу выполнить некоторую очистку своих файлов, но проблема заключается в том, что, когда я убиваю его с помощью ТМ, функции не работают. Похоже, я не получаю сообщения. Я думаю, что проблема в том, что диспетчер задач отправляет сообщение в приложение C #, а не в DLL C ++.

Некоторый код:

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();
Или вы получитеCTRL_CLOSE_EVENT Событие в консольных приложениях. Обязательная ссылка на соответствующий старенький материалblog post Christian.K
Вы получаете WM_CLOSE только при использовании вкладки Приложения в диспетчере задач. Убить его на вкладке «Процессы» - грубое завершение. Как сообщение заканчивается в коде C ++, очень неясно, пользовательский интерфейс обычно делается в C #. Hans Passant

Ваш Ответ

1   ответ
3

если его убивают. НачатьTerminateProcess - увидеть мой основной момент:

The TerminateProcess function is used to unconditionally cause a process to exit. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.

This function stops execution of all threads within the process and requests cancellation of all pending I/O...

РЕДАКТИРОВАТЬ: Ханс Пассант комментирует способ завершения задач - WM_CLOSE вы получаете только при использовании вкладки Приложения в диспетчере задач. Убить его на вкладке «Процессы» - грубое завершение (TerminateProcess).

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededPInvoke.NetError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Thanatos
Error: User Rate Limit Exceeded Thanatos

Похожие вопросы