如何从全局钩子中排除线程

时间:2010-01-25 08:31:20

标签: c# interop

我们正在全球范围内联系T extOut()ExtTextOut()DrawText()个方法。

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

但我们希望将我们的应用程序(我们用来安装/卸载挂钩)排除在外。如果SetWindowsHookEx()的最后一个参数为0(零),它将挂钩所有现有线程。如果当前线程是“OurApplication.exe”,如果在此处检查,然后将其排除在钩子之外或立即取消钩子。 请提供帮助。

3 个答案:

答案 0 :(得分:0)

我不认为这是可能的。您可以挂钩所有内容或特定线程。 为什么不用function_address中的任何代码过滤掉你的应用程序?大多数(如果不是全部)CBT钩子回调在wParam或lParam参数中提供窗口句柄。然后,您可以从该句柄获取进程ID,并将其与应用程序pid进行比较。

答案 1 :(得分:0)

脱离我的头顶:

在安装钩子时,将钩子dll传递给要忽略的进程的PID。确保PID存储在共享部分中,以便所有钩子实例都看到相同的值。

在你的钩子函数中,检查当前进程PID是否与传入的进程相匹配。如果是,请不要做你的钩子,只需传递给CallNextHookEx。

我不喜欢这个,因为它增加了在钩子函数中完成的工作,这总是很糟糕。但它似乎应该原则上起作用。

答案 2 :(得分: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;
}