我们正在全球范围内联系T extOut()
,ExtTextOut()
和DrawText()
个方法。
即
hhook = SetWindowsHookEx(WH_CBT, function_address, module_handle, 0);
但我们希望将我们的应用程序(我们用来安装/卸载挂钩)排除在外。如果SetWindowsHookEx()
的最后一个参数为0(零),它将挂钩所有现有线程。如果当前线程是“OurApplication.exe”,如果在此处检查,然后将其排除在钩子之外或立即取消钩子。
请提供帮助。
答案 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;
}