关于 HOOK的2点不解 求指点

ybblack001 2008-12-17 09:40:43
LRESULT CALLBACK LowLevelMouseProc(          int nCode,
WPARAM wParam,
LPARAM lParam
)
{
//鼠标的钩子过程
MOUSEHOOKSTRUCT * mousestruct = (MOUSEHOOKSTRUCT *)lParam;
//获取鼠标信息
if (wParam == WM_LBUTTONDOWN)//鼠标左键按下
{

if (clicknoA == 0)
{
isfinshed = 0;
clicknoA = 1;
point[0] = mousestruct->pt.x;
point[1] = mousestruct->pt.y;
// MessageBox(0,"开始获取","",MB_OK);

}
else if (clicknoB == 0)
{
clicknoB = 1;
point[2] = mousestruct->pt.x;
point[3] = mousestruct->pt.y;
isfinshed = 1;
// MessageBox(0,"完毕","",MB_OK);
}

}



return 1;
// return CallNextHookEx(g_mouse, nCode, wParam, lParam);
}

void sethook()
{
//设置钩子
g_mouse=SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,
GetModuleHandle("cutpicture.dll"),0);
}


疑问1 我上面的本意是设置全局钩子 但运行结果是虽然屏蔽了所有的鼠标案件 但是只有在运行钩子的程序的窗口上点击鼠标才会显示messagebox,如果在屏幕其他地方点击鼠标虽然也进行屏蔽但是并不显示消息
疑问2 点击一次鼠标会多次调用鼠标钩子过程 。 我之前是使用一个变量进行鼠标点击记录 但发现点击一下竟然会来回出现messagebox - -迷惑

在c# 和 c++ 测试都是这个效果 求高人指点
...全文
152 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
我是苦力 2009-03-23
  • 打赏
  • 举报
回复
问题1: g_mouse=SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,
GetModuleHandle("cutpicture.dll"),0);

上面这句的第三个参数错误。应为主程序中的hModule, 在dll入口的DLLMain中得到。

问题2: 进行if (nCode >= HC_ACTION)判断

LZ可以试试。
kxtm01 2008-12-18
  • 打赏
  • 举报
回复
对钩子一窍不通,慢慢学习~~~
ybblack001 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 net5i 的回复:]
楼主第一个问题,肯定是因为下面两个if,执行一次后被置为1了,后来不成立导致的:
if (clicknoA == 0)
else if (clicknoB == 0)

这两个变量是什么?除了在这两个if内被设置为1,还有在哪里设置的?
[/Quote]
我设置两个就是避免重复调用的 不过现在仔细一看貌似没什么作用 不过就算是这样也应该只调用2遍啊。。。我是用回车点的
但是我很奇怪为什么会重复调用多次呢?如果是键盘我还可以理解毕竟是up和down2个事件
jy251 2008-12-17
  • 打赏
  • 举报
回复
问题1
LZ你的HOOK类必须写成一个DLL,这样来调用,你才可以实现全HOOK,不要问我为什么,我也不记得在哪看到的了。

问题2
HOOK是有着方面的问题,我之前也试过,发生和你同样的问题,没有解决。。。。
net5i 2008-12-17
  • 打赏
  • 举报
回复
楼主第一个问题,肯定是因为下面两个if,执行一次后被置为1了,后来不成立导致的:
if (clicknoA == 0)
else if (clicknoB == 0)

这两个变量是什么?除了在这两个if内被设置为1,还有在哪里设置的?
net5i 2008-12-17
  • 打赏
  • 举报
回复
嗯,我认为弹出好几遍是正常的,因为估计你是用鼠标关闭的对话框,你按回车键关闭对话框试试
ybblack001 2008-12-17
  • 打赏
  • 举报
回复
恩 目前是没有调用卸载 但是第二个问题出现的时间 是运行中 我本意是点第一下鼠标 显示出“开始获取”再点一下显示“完毕”,但结果点一下就是2个框反复弹好几遍
net5i 2008-12-17
  • 打赏
  • 举报
回复
搂主的第二个问题是不是因为没有及时删除这个钩子引起的?也就是说程序退出时,没有调用UnhookWindowsHookEx方法?
net5i 2008-12-17
  • 打赏
  • 举报
回复
搂主的第二个问题是不是因为没有及时删除这个钩子引起的?也就是说没有程序退出时,没有调用UnhookWindowsHookEx方法?
net5i 2008-12-17
  • 打赏
  • 举报
回复
噢,不好意思,没看搂主代码,你已经是这样做的
那我就没遇到这种情况了,键盘是可以的
net5i 2008-12-17
  • 打赏
  • 举报
回复
搂主是不是把钩子指定为监视当前线程?
也就是说API函数:SetWindowsHookEx的最后一个参数设置为当前线程ID了?
设置了线程id的话,这个钩子就会仅仅监视这个线程,如果想监视所有,楼主置为0就可以了,不妨试试

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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