dll项目里是这样的:
#pragma data_seg(".shareddata")
HHOOK hbHook=NULL;
HMODULE hmodDll = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.shareddata,RWS")
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
if(hmodDll == NULL)
hmodDll = (HMODULE)hModule;//DLL实例句柄
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
UnHook();
}
return TRUE;
}BOOL WINAPI installhook()
{
hbHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,hmodDll,0);
return TRUE;
}
LRESULT WINAPI CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode<0)
return CallNextHookEx(hHook, nCode, wParam, lParam);
switch(nCode)
{
case HCBT_CREATEWND:
//窗口建立时拦截
//MessageBox(NULL,TEXT("KAO"),TEXT("KAO"),MB_OK);
break;
}
LRESULT RetVal = CallNextHookEx(hbHook, nCode, wParam, lParam );
return RetVal;
}
BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hHook);
return unhooked;
}进程窗体里我在WM_CREATE里调用DLL
case WM_CREATE:
static HINSTANCE hinstDLL;
typedef BOOL (CALLBACK *inshook)();
inshook instkbhook;
if(hinstDLL=LoadLibrary((LPCTSTR)"d:\\code\\c\\hook\\debug\\hook.dll"))
{
instkbhook=(inshook)GetProcAddress(hinstDLL, "installhook");
instkbhook();
}
break;
现在我可以拦截到调用进程窗体的消息事件,但是别的进程一点反应都没有,调了半天了,没有头绪了。
#pragma data_seg(".shareddata")
HHOOK hbHook=NULL;
HMODULE hmodDll = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.shareddata,RWS")
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
if(hmodDll == NULL)
hmodDll = (HMODULE)hModule;//DLL实例句柄
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
UnHook();
}
return TRUE;
}BOOL WINAPI installhook()
{
hbHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,hmodDll,0);
return TRUE;
}
LRESULT WINAPI CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode<0)
return CallNextHookEx(hHook, nCode, wParam, lParam);
switch(nCode)
{
case HCBT_CREATEWND:
//窗口建立时拦截
//MessageBox(NULL,TEXT("KAO"),TEXT("KAO"),MB_OK);
break;
}
LRESULT RetVal = CallNextHookEx(hbHook, nCode, wParam, lParam );
return RetVal;
}
BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hHook);
return unhooked;
}进程窗体里我在WM_CREATE里调用DLL
case WM_CREATE:
static HINSTANCE hinstDLL;
typedef BOOL (CALLBACK *inshook)();
inshook instkbhook;
if(hinstDLL=LoadLibrary((LPCTSTR)"d:\\code\\c\\hook\\debug\\hook.dll"))
{
instkbhook=(inshook)GetProcAddress(hinstDLL, "installhook");
instkbhook();
}
break;
现在我可以拦截到调用进程窗体的消息事件,但是别的进程一点反应都没有,调了半天了,没有头绪了。
我看网上的例子是这么写的,那该写在哪里呢。问题是我使用WH_Keyborad的时候这样写是可以勾到所有的事件的,不知道为什么换了这个就不行了
钩子的Dll和你写的类似,只能用在currentThread中,如果SetWindowsHookEx最后一个参数为0,则钩子不能成功安装,只能为GetCurrentThreadId()
你在哪看到的例子?能不能发给我看看?
UnHook()什么的函数在安装hook的程序里调用...