Итак, у меня есть dll C++, который я использую в своем приложении C# для мониторинга сообщений Windows. Я хочу знать, отправляются ли WM_CLOSE и WM_QUERYENDSESSION, потому что я не вижу этого из приложения C#. Если я получаю одно из этих сообщений, я хочу сделать некоторую очистку с моими файлами, но проблема в том, что я убиваю его с помощью TM, функции не работают. Это швы, что я не получаю сообщения. Я думаю, проблема заключается в том, что диспетчер задач отправляет сообщение в приложение 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();
При использовании вкладки «Приложения» в диспетчере задач вы получаете WM_CLOSE. Убить его с вкладки «Процессы» является грубое завершение. Как сообщение в коде C++ очень неясно, пользовательский интерфейс обычно выполняется на C#. –
Или вы получите событие CTRL_CLOSE_EVENT в консольных приложениях. Обязательная ссылка на соответствующее oldnewthing [сообщение в блоге] (http://blogs.msdn.com/b/oldnewthing/archive/2004/07/22/191123.aspx) –