SetWindowsHook调用失败!

gray01 2008-07-15 09:32:27
我现在写了一个全局鼠标钩子,dll中的核心函数如下:

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就是出错,不知道是不是病毒的原因。希望了解这个问题的高手给予解答。谢谢
...全文
517 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ITwudi 2008-11-10
  • 打赏
  • 举报
回复
在VISTA上,这函数SetWindowsHookEx用起来挺麻烦的.
coolerhero 2008-07-15
  • 打赏
  • 举报
回复
钩子安装一次就行了
cnzdgs 2008-07-15
  • 打赏
  • 举报
回复
要改参数直接做一个接口来改就可以了,不要来回安装和卸载钩子。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧