我要做一个程序,里面要用到一个全局的健盘钩子,按F12弹出主窗口,但程序是单独的一个exe,为了方便使用不能使用除了exe之外的文件,包括dll文件,请问下全局钩子能不能在静态库中使用?我在静态库中使用全局钩子只能窗口第一次显示的时候那个钩子函数才会被调用,当切换一下窗口就失效了,不知道是什么原因,代码如下:#pragma data_seg("shared")
HHOOK g_hook = NULL;
HINSTANCE g_hInstance = NULL;
#pragma data_seg()#pragma comment(linker,"/SECTION:shared,RWS")
LRESULT CALLBACK KeyboardProc( int code,
WPARAM wParam,
LPARAM lParam
)
{
if(lParam & 0x80000000 && wParam==VK_F12)
{
AfxMessageBox("1");
}
AfxMessageBox("2");
return((int)CallNextHookEx(g_hook,code,wParam,lParam));
}HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
void InstallHook(HINSTANCE hInstance)
{ g_hInstance = hInstance;
g_hook = ::SetWindowsHookEx(WH_KEYBOARD , KeyboardProc, g_hInstance ,0);
//把 g_hInstance 换成ModuleFromAddress(KeyboardProc)也是一样的效果
if(g_hook == NULL)
{
AfxMessageBox("失败");
}
else
{
AfxMessageBox("成功");
}
} void UnInstallHook()
{
::UnhookWindowsHookEx(g_hook);
}
HHOOK g_hook = NULL;
HINSTANCE g_hInstance = NULL;
#pragma data_seg()#pragma comment(linker,"/SECTION:shared,RWS")
LRESULT CALLBACK KeyboardProc( int code,
WPARAM wParam,
LPARAM lParam
)
{
if(lParam & 0x80000000 && wParam==VK_F12)
{
AfxMessageBox("1");
}
AfxMessageBox("2");
return((int)CallNextHookEx(g_hook,code,wParam,lParam));
}HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
void InstallHook(HINSTANCE hInstance)
{ g_hInstance = hInstance;
g_hook = ::SetWindowsHookEx(WH_KEYBOARD , KeyboardProc, g_hInstance ,0);
//把 g_hInstance 换成ModuleFromAddress(KeyboardProc)也是一样的效果
if(g_hook == NULL)
{
AfxMessageBox("失败");
}
else
{
AfxMessageBox("成功");
}
} void UnInstallHook()
{
::UnhookWindowsHookEx(g_hook);
}
其实我建议你用raw input或hot key,这样对别的程序影响小
直接在主程序中调用SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)Hotkey_Filter, GetModuleHandle("hotkey"), ThreadID);吗?