2010-01-25 75 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; 
}