我写了一个DLL,只有一个导出函数Start,我在注册表RUN键里增加了一个值 rundll32 ...\myDll.dll,Start 来计算机启动时运行我的DLL。
extern "C" int __stdcall Start()
{
if(! InstallFilter(TRUE)) //安装钩子
return 0;
WaitForSingleObject(stopEvent.m_hObject,INFINITE); //一直等到钩子卸载
return 1;
}BOOL InstallFilter(BOOL bInstall)
{
if(bInstall)
{
hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) CallBackProc,theApp.m_hInstance,0);
myFile.Open (FPATH,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareDenyNone );
if(hHook)
{
stopEvent.ResetEvent();
return TRUE;
} }
else
{
if(UnhookWindowsHookEx(hHook))
{
myFile.Close();
stopEvent.SetEvent();
return TRUE;
}
}
return FALSE;
}
现在已经能捕获键盘事件了,可是当我按F12(我设的)就卸载钩子,但执行到UnHookWindowsHook 的时候却失败了(返回FALSE),导致不能退出,大家给看看啊
extern "C" int __stdcall Start()
{
if(! InstallFilter(TRUE)) //安装钩子
return 0;
WaitForSingleObject(stopEvent.m_hObject,INFINITE); //一直等到钩子卸载
return 1;
}BOOL InstallFilter(BOOL bInstall)
{
if(bInstall)
{
hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) CallBackProc,theApp.m_hInstance,0);
myFile.Open (FPATH,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareDenyNone );
if(hHook)
{
stopEvent.ResetEvent();
return TRUE;
} }
else
{
if(UnhookWindowsHookEx(hHook))
{
myFile.Close();
stopEvent.SetEvent();
return TRUE;
}
}
return FALSE;
}
现在已经能捕获键盘事件了,可是当我按F12(我设的)就卸载钩子,但执行到UnHookWindowsHook 的时候却失败了(返回FALSE),导致不能退出,大家给看看啊
嗯。1404表示你的hook句柄已经无效了。
还有别的地方进行释放么?
那么,就是说hHook只有问题。
你应该把hHook值放到共享节中。
#pragma data_seg(".myshare")
HHOOK hHook = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.myshare,rws")
static HHOOK hHook;
把hHook的声明放到共享节中,用下面的代码:
#pragma data_seg(".myshare")
HHOOK hHook = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.myshare,rws")
你的代码中的错误不少啊。
1.CEvent也要放到共享节中
#pragma data_seg(".myshare")
CEvent stopEvent;
HHOOK hHook = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.myshare,rws")
2.不能在钩子函数体内卸载钩子。
所以你必须也把InstallFilter导出,然后在用Rundll32执行卸载函数。
具体原因是因为钩子过程在运行的时候认为hHook是空的局部变量,用SoftIce调试的时候可以看到。原来我用VC一直调试不进去,最后愤怒了,用SoftIce调试真它的麻烦。
顺便问问wangk(倒之) ( ),你用SoftIce怎么调试的?介绍介绍 :)
需要加在Symbol file么?