所以我有一個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();
在任務管理器中使用應用程序選項卡時,您只能獲得WM_CLOSE。從進程選項卡中殺死它是一個粗魯的終止。消息如何在C++代碼中結束很不清楚,UI通常是用C#完成的。 –
或者您將在控制檯應用程序中收到「CTRL_CLOSE_EVENT」事件。強制鏈接到相關的oldnewthing [博客文章](http://blogs.msdn.com/b/oldnewthing/archive/2004/07/22/191123.aspx) –