下面的函数都在一个dll中实现 //通过内存地址取得模块句柄
HMODULE ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if (VirtualQuery(pv,&mbi,sizeof(mbi))!= 0)
{
return (HMODULE)mbi.AllocationBase ;
}
else
return NULL;
}
////////////////////////////////////////////////////////////
//dll导出函数
BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId,,HWND hWnd)
{
BOOL bOK;
if(bInstall)
{
g_hhook = SetWindowsHookEx(WM_KEYBOARD,KeyHookProc,ModuleFromAddres(KeyHookProc),dwThreadId);
bOK=(g_hook!=NULL);
}
else
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
return bOK;
}
注:KeyHookProc是钩子函数名,它的实现未写出我的问题是:为了设置全局钩子,SetWindowsHookEx的第三个函数为该钩子所在dll的实例句柄,
为什么将钩子函数的地址代人VirtualQuery(pv,&mbi,sizeof(mbi))后,mbi.AllocationBase的就是dll模块的实例句柄?
HMODULE ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if (VirtualQuery(pv,&mbi,sizeof(mbi))!= 0)
{
return (HMODULE)mbi.AllocationBase ;
}
else
return NULL;
}
////////////////////////////////////////////////////////////
//dll导出函数
BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId,,HWND hWnd)
{
BOOL bOK;
if(bInstall)
{
g_hhook = SetWindowsHookEx(WM_KEYBOARD,KeyHookProc,ModuleFromAddres(KeyHookProc),dwThreadId);
bOK=(g_hook!=NULL);
}
else
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
return bOK;
}
注:KeyHookProc是钩子函数名,它的实现未写出我的问题是:为了设置全局钩子,SetWindowsHookEx的第三个函数为该钩子所在dll的实例句柄,
为什么将钩子函数的地址代人VirtualQuery(pv,&mbi,sizeof(mbi))后,mbi.AllocationBase的就是dll模块的实例句柄?
ModuleFromAddres(SetKeyHook)