键盘钩子问题:我想在我的dll中加如键盘钩子,我希望任何进程调用它的时候,都能响应键盘事件,不需要进程序loadlabary请问如何做?在我写的其他程序中loadlibary,能够响应键盘,但是如果把loadlibary放在dll本身???能行吗?我在DLL中已经加如了KeyboardProc(.....)和installhook()关于如何安装这个钩子,我不知道怎么办,我尝试在DllMain中加入installhook();
编译是没问题,但是并未响应键盘事件!
另外用到hins=AfxGetInstanceHandle();这句的时候编译没问题,但运行就出错。
请问怎么办?
编译是没问题,但是并未响应键盘事件!
另外用到hins=AfxGetInstanceHandle();这句的时候编译没问题,但运行就出错。
请问怎么办?
然后在安装钩子时进程项填NULL就可以实现全局系统HOOK
监视其它进程
DLL中怎么可以loadlibary呢..
loadlibary就是用来半截DLL的啊,,
#pragma data_seg(".sharedata")
static HHOOK hkb=NULL;
#pragma data_seg()
HINSTANCE hins;LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam==VK_CONTROL)//显示主窗口
{
MessageBox(NULL,"hello","info",0);
}
return 0;
}BOOL __declspec(dllexport)_stdcall installhook()
{
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
return true;
}BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
return unhooked;
}
BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
/*我的hins还没初始化,用 hins=AfxGetInstanceHandle();运行时就会出错,而我在我自己写的程序中这句话就不会有问题*/
installhook();//这句话对吗?
}
键盘钩子只要写在DLL文件中就可以实现
全局监视的
hins初始化可以这样写
BOOL CHodllApp::InitInstance ()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hins=AfxGetInstanceHandle();
}
但不知道怎么回事,没法响应键盘。
安装钩子不要放在DllMain()中,你把installhook() 做成导出函数,
在程序中loadLibray()后再调用,,
因为你的installhook()中这样写了
SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
所以一样能起到HOOK全局的目的,,
你把全局HOOK的意思理解错了,其实只要你的程序安装了全局HOOK
就可以HOOK所有进程了,并非要每个进程都去安装,
网上这方面的文章很多,你用google搜一下,,
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
//如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)//加载DLL
{
TRACE0("MOUSEHOOK.DLL Initializing!\n");
//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(MousehookDLL, hInstance))
return 0;
glhInstance=hInstance;//在这里初始化
//插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)//释放DLL
{
TRACE0("MOUSEHOOK.DLL Terminating!\n");
//终止这个链接库前调用它
AfxTermExtensionModule(MousehookDLL);
}
return 1;
}