请教一个全局钩子的问题

phil2036 2008-04-22 09:45:30
最近对钩子技术比较感兴趣,看了点资料自己倒腾个程序,碰到点问题向各位请教一下,挂钩子和撤销钩子没什么问题,主要问题是出在这里,我的目的是通过钩子来将鼠标右键事件变成左键事件左键事件变成右键事件(当然不用全局钩子也能做到,我主要是为了学习钩子技术),但是我做了以后发现左键事件能够改成右键事件而右键事件改不成左键事件,并且事件触发的位置也不对,找不到错在哪里请各位帮忙看一下代码,下面是我的钩子CALLBACK函数
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_LBUTTONUP || wParam == WM_RBUTTONUP
|| wParam == WM_LBUTTONDOWN || wParam == WM_RBUTTONDOWN)
{
LPMOUSEHOOKSTRUCT lpMouse = (LPMOUSEHOOKSTRUCT) lParam;
HWND targetWnd = lpMouse->hwnd;
POINT pt = lpMouse->pt;
::ScreenToClient(targetWnd,&pt);
LPARAM newlParam = MAKEWORD(pt.x,pt.y);
if (wParam == WM_RBUTTONUP)
::SendMessage(targetWnd,WM_LBUTTONUP,
(WPARAM)lpMouse->wHitTestCode,newlParam);
else if (wParam == WM_LBUTTONUP)
::SendMessage(targetWnd,WM_RBUTTONUP,
(WPARAM)lpMouse->wHitTestCode,newlParam);
else if (wParam == WM_RBUTTONDOWN)
::SendMessage(targetWnd,WM_LBUTTONDOWN,
(WPARAM)lpMouse->wHitTestCode,newlParam);
else if (wParam == WM_LBUTTONDOWN)
::SendMessage(targetWnd,WM_RBUTTONDOWN,
(WPARAM)lpMouse->wHitTestCode,newlParam);
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}


=================分割线=====================
顺便问一下各位,有没有什么书介绍钩子技术比较全面的,帮忙推荐一下
...全文
39 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
UltraBejing 2008-05-01
我也想了解,谢谢LZ.
回复
菜牛 2008-04-23
你直接修改消息值,其它什么都不要改。
回复
phil2036 2008-04-22
谢谢greatws同学。。。你怀疑的没有拦截消息应该是正确的。那么哪位能告诉我怎么拦截消息,是不是不要调用最后的CallNextHookEx
回复
phil2036 2008-04-22
钩子是肯定启用了。。。从调试里面可以看到,而且左键变右键的功能也已经实现了,就是不知道为什么右键不能变成左键。至于说消息发生位置的错误刚才greatws指出来的错误修正掉以后也已经没有了
回复
king820802 2008-04-22
先进行判断,有没有进入这个回调函数,也许你根本就没启用钩子
回复
phil2036 2008-04-22
呵呵,有可能。。。也只是网上看了点资料,一知半解的就在写代码。共同学习吧
回复
greatws 2008-04-22
lParam值的低位是鼠标的X值,高位是鼠标的Y值
LPARAM newlParam = MAKEWORD(pt.x,pt.y);
LPARAM newlParam = pt.x+(pt.y<<16);

估计你没有拦截鼠标消息吧,这个hook只起到监听作用吧。

PS:钩子我也是刚开始学,见笑哈
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-22 09:45
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……