Qt编写钩子库遇到问题。
使用qt mingw 编写键盘钩子。遇到点问题。
用到的接口是windows的SetWindowsHookEx,hook的是WH_KEYBOARD事件,已经封装成了一个DLL,现在却不能做到hook全局的键盘事件。
现在是调用这个库的主程序中的键盘事件可以抓取到,试了下在记事本和word中输入文字也可以抓取到,但是其他程序中的键盘事件却不行。
我用同样的方法,使用vs编译了一个库却可以在任意程序中输入信息都能抓到键盘事件。(qq的输入框输入数字可以抓到,输入汉字不行,怀疑是qq有什么保护机制。)
以下为qt封的dll库的 hook部分的代码。
在线等回复。
-------------------------------------------------
HINSTANCE g_dllHinst __attribute__((section(".lucifd"))) = NULL;
HHOOK g_keyHook __attribute__((section(".lucifd"))) = NULL;
HWND g_caller __attribute__((section(".lucifd"))) = NULL;
HookHandler::HookHandler(QObject *parent) : QObject(parent)
{
}
HMODULE ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(VirtualQuery(pv,&mbi,sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
void HookHandler::installHook(HWND caller, DWORD threadid, void *fun, HINSTANCE hins, WINBOOL stop)
{
g_keyHook = SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,ModuleFromAddress((PVOID)KeyBoardProc),threadid);
g_dllHinst = hins;
g_caller = caller;
}
LRESULT KeyBoardProc(int ncode, WPARAM wParam, LPARAM lParam)
{
qDebug()<<"dll key input";
if (ncode < 0 || ncode == HC_NOREMOVE)
{
return ::CallNextHookEx(g_keyHook, ncode, wParam, lParam);
}
if (lParam & 0x40000000) // Check the previous key state
{
return ::CallNextHookEx(g_keyHook, ncode, wParam, lParam);
}
::PostMessage(g_caller,WM_USER+101,wParam,lParam);
return ::CallNextHookEx(g_keyHook, ncode, wParam, lParam);