2012-05-22 59 views
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(); 
+2

在任務管理器中使用應用程序選項卡時,您只能獲得WM_CLOSE。從進程選項卡中殺死它是一個粗魯的終止。消息如何在C++代碼中結束很不清楚,UI通常是用C#完成的。 –

+2

或者您將在控制檯應用程序中收到「CTRL_CLOSE_EVENT」事件。強制鏈接到相關的oldnewthing [博客文章](http://blogs.msdn.com/b/oldnewthing/archive/2004/07/22/191123.aspx) –

回答

3

你的過程中不會得到任何消息,如果它被殺死。從TerminateProcess開始 - 請參閱我的亮點:

TerminateProcess函數用於無條件地導致進程退出。如果使用TerminateProcess而不是ExitProcess,動態鏈接庫(DLL)維護的全局數據狀態可能會受到影響。

此功能停止進程中的所有線程的執行,並要求所有未決的I/O ...

編輯取消:漢斯帕桑特途中任務終止評論 - 您使用時只得到WM_CLOSE任務管理器中的應用程序標籤。從進程選項卡中終止是一個粗魯的終止(TerminateProcess)。

+0

並且在WM_QUERYENDSESSION啓動關閉的情況下? – Thanatos

+1

是的。關於任務管理器的附註:我認爲在任務管理器試圖在終止之前正確地停止進程時,有(有)個案例,但是如果對進程很重要,我只希望在進程中使用TerminateProcess。 –

+0

然後你知道一種方法來查明是否使用c#啓動了關機嗎?在winapi我用queryendsesion但在這裏? – Thanatos

相關問題