2010-01-25 76 views
2

我們正在全球範圍內連接T extOut(),ExtTextOut()DrawText()方法。如何排除全局鉤子中的線程

hhook = SetWindowsHookEx(WH_CBT, function_address, module_handle, 0); 

但是我們想從被鉤排除我們的應用程序(我們使用的是安裝/卸載鉤子)。如果SetWindowsHookEx()的最後一個參數是0(零),它將掛鉤所有現有線程。如何在此檢查當前線程是否爲「OurApplication.exe」,然後將其從掛鉤中排除或立即解除掛鉤。 請提供幫助。

+0

您是否使用了非託管C++ dll照顧全局鉤子的相當熟知的技術? – BillW 2010-01-25 08:43:18

+0

你不能用SetWindowsHookEx鉤住DrawText()等。你不能在C#代碼中編寫全局鉤子。 – 2010-01-25 13:25:45

回答

0

我不認爲這是可能的。你要麼鉤住一切,要麼鉤住一個特定的線程。 你爲什麼不用你在function_address中的任何代碼過濾掉你的應用程序?大多數(如果不是全部的話)CBT鉤子回調提供wParam或lParam參數的窗口句柄。然後您可以從該句柄中獲取進程ID並將其與您的應用程序pid進行比較。

0

關閉我的頭頂:

傳遞進程的PID你想,當你安裝鉤子忽略鉤子DLL。確保PID存儲在共享部分中,以便所有鉤子實例看到相同的值。

在你的鉤子函數中,檢查當前進程PID是否與傳入的進程匹配。如果有,請不要做你的鉤子,只需傳遞給CallNextHookEx。

我不喜歡這個,因爲它增加了在鉤子函數中完成的工作,這總是不好的。但它似乎應該原則上工作。

0

謝謝專家回覆我們的問題。我們找到了做到這一點的方法。 現在我們在注入dll的入口點添加了以下代碼塊,並且它工作正常。

BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved) 
{ 
    switch (dwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
      IsDebuggerPresent(); 

      // Exclude the "someapplication.exe" from hooking 
      GetModuleFileName(GetModuleHandle(NULL),Work,sizeof(Work)); 
      PathStripPath(Work); 

      if (_stricmp(Work, "someapplication.exe") != 0) 
      { 
       InstallWindowHooks(); 
      } 

     break; 
     case DLL_PROCESS_DETACH: 
      hWindowReceiver = NULL; 
      CleanUp(); 
     break;  
    } 
    return TRUE; 
}