2012-07-25 149 views
0

我需要在應用程序啓動後立即執行一些操作,並在其退出之前(某種使用UMDH的自動內存泄漏檢測)。掛鉤到窗口進程

我已經準備好了注入到所有進程和DLL_PROCESS_ATTACH的DLL我正在執行我的第一個操作(剛剛在應用程序啓動之後) - 所以我的問題的這部分已經解決了。

問題出在第二部分 - 在進程即將退出時執行操作。

我已經在DLL_PROCESS_DETACH中試過了,但是這個太晚了,我需要早點掛鉤。

使用windows鉤子機制,我已經迷上了WH_GETMESSAGE:

hhk = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) &GetMsgProc, NULL , GetCurrentThreadId()); 

而且GetMsgProc()函數:

LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam) 
{ 
    if(nCode == HC_ACTION) 
    { 
     PMSG msg = (PMSG) lParam; 
     if(msg->message == WM_CLOSE) 
     { 
       OutputDebugString(L"WM_CLOSE"); 
     } 
     if(msg->message == WM_QUIT) 
     { 
       OutputDebugString(L"WM_QUIT"); 
     } 
     if(msg->message == WM_DESTROY) 
     { 
       OutputDebugString(L"WM_DESTROY"); 
     } 
    } 
    return CallNextHookEx(hhk, nCode, wParam, lParam); 
} 

但使用這種方法,我只檢測WM_CLOSE消息(當我將使用「X」按鈕關閉應用程序時)。我不知道爲什麼我沒有檢測到WM_QUIT消息,從來沒有。

任何想法,如何在應用程序即將退出時執行一些操作?

(我知道少走彎路,但在我的項目不能使用它們...)

+0

有你的鉤子DLL勾'DLL_PROCESS_ATTACH'階段'ExitProcess'功能。 – Jay 2012-07-25 23:12:29

+1

如何設置鉤子到ExitProcess函數? – dzima 2012-07-26 13:50:02

回答

0
  1. 除了WH_GETMESSAGE嘗試WH_CALLWNDPROC。所以,當你收到主應用程序窗口的WM_DESTROY - 這可能是一個標誌。

  2. 我想,理想情況下,您必須覆蓋主應用程序窗口的窗口過程(如果可能的話)。 Smth like

  3. WM_QUIT消息不由窗口過程處理。當GetMessage參見WM_QUIT時,它返回FALSE。所以,可能是這個問題。您可以嘗試更改IAT表(導入)以覆蓋GetMessage [A/W]過程。

    WNDPROC gpfnOldProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)YourWndProc); 
    
+0

我試過了WH_CALLWNDPROC,但在那裏我只接收了數百個WM_DESTROY--我需要在應用程序即將退出時掛鉤,所以這個解決方案對我來說是不夠的。我不能覆蓋主窗口過程 - 我必須掛鉤所有應用程序,如基準測試,WLK測試等(解決方案必須是通用的) – dzima 2012-07-26 07:23:56

+0

好的,但我沒有理由不覆蓋窗口過程。答案已更新。 – Maximus 2012-07-26 07:40:33