BOOL CMouseHook::StartHook(HWND hWnd,HWND spyhWnd)
{
BOOL bResult=FALSE;
glhSpyWnd = spyhWnd;
glhDisplayWnd=hWnd;
glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
if(glhHook!=NULL)
{
bResult=TRUE;
}
//设置显示目标窗口标题编辑框的句柄
return bResult;
}
//卸载钩子
BOOL CMouseHook::StopHook()
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhSpyWnd=NULL;
glhDisplayWnd=NULL;//清变量
glhHook=NULL;
}
}
return bResult;
}
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
if (nCode>=0)
{
if(wparam == WM_LBUTTONDOWN)
{
HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt);
if( ::IsWindow(glhDisplayWnd) && (glhDisplayWnd == glhTargetWnd))
{
flag = TRUE;
}
else
{
if(flag && ::IsWindow(glhSpyWnd) )
{
::PostMessage( glhSpyWnd, HM_GETTEXTMSG , NULL, (LPARAM)glhDisplayWnd );
flag = FALSE;
}
}
}
}
return CallNextHookEx(glhHook,nCode,wparam,lparam);
//继续传递消息
}
这个鼠标钩子是根据网上找到的一些源代码改的。
主程序中对这个dll调用的代码如下:
if(!hookFlag)
{
hookFlag = m_Mhook.StartHook( g_hWnd, g_hMe );
}
else
{
m_Mhook.StopHook();
hookFlag = m_Mhook.StartHook( g_hWnd, g_hMe );
}
每次完成一次任务就重新创建一个钩子,因为我要往钩子函数里面传入新的参数。现在遇到的问题是第一次StartHook的时候没有问题,返回是TRUE,但是第二次StopHook之后再执行StartHook就出错,返回是FALSE,钩子不能创建,跟踪调试发现在第二次SetWindowsHook返回就是0,出错,而用GetLastError得到的出错代码是0,不知道为什么?
拿到公司的机器上运行发现第二次SetWindowsHook创建没有问题,代码能够正确执行,而在自己的机器上第二次SetWindowsHook就是出错,不知道是不是病毒的原因。希望了解这个问题的高手给予解答。谢谢