HOOK,如何获取点击了右键菜单中的哪个选项???

Lings 2009-11-06 02:42:35
我通过WH_GETMESSAGE、WH_CALLWNDPROC两个钩子,钩取WM_COMMAND、WM_SYSCOMMAND、WM_MENUSELECT可以成功获取大部分的菜单点击信息,但是现在还有一个问题:

右键菜单(比如在桌面点右键,然后选择“刷新”;在文件上点右键,然后选择“复制”),我到现在还不知道,点击“刷新”、“复制”之后,操作系统向哪个窗口,发送了什么消息??

请各位大侠帮忙啊!
...全文
661 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongchenxinxikeji 2011-01-07
  • 打赏
  • 举报
回复
想要代码呀
Lings 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhan1616 的回复:]
你可以把你成功的代码发一份给我吗???谢谢!www.yiwannai.com@163.com
[/Quote]

不好意思啊,因为是在公司做的,代码是不允许传出的!
大致的思路是创建 WH_MOUSE, WH_CALLWNDPROC, WH_GETMESSAGE这三个钩子,作用:

WH_GETMESSAGE:
通过截获WM_COMMAND获取普通菜单的消息;通过截获WM_MENUSELECT获取特殊的Popup菜单:如资源管理器或者IE里面的“收藏”菜单;

WH_CALLWNDPROC:
通过截获WM_MENUSELECT获取Popup菜单、命令菜单 [CallWndProc中主要用于提取菜单的句柄],保存弹出菜单的句柄,保存最后一个菜单项的名称、位置,备右键菜单使用

WH_MOUSE:
CALLWNDPROC中保存的最后一个菜单项的名称、位置,通过在鼠标钩子中判断是否有过相关的点击,来判断是否点击了右键菜单的某一项。[注意在CALLWNDPROC及时销毁这些保存的值]


大致就这么多了,希望对你有帮助,呵呵!
zhan1616 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kmmqq 的回复:]
引用 14 楼 cnzdgs 的回复:
没有WM_MENUSELECT吗?
WM_MENUSELECT消息的lParam参数是菜单句柄,wParam参数的低16位是菜单项索引值,GetMenuString可以得到菜单项文字。


恩,划过的时候是有,但点击的时候貌似没得,不过得到了句柄,我可以枚举,然后通过鼠标点击的位置来定位某个菜单,呵呵,谢谢大家,谢谢cnzdgs
[/Quote]

你可以把你成功的代码发一份给我吗???谢谢!www.yiwannai.com@163.com
Lings 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cnzdgs 的回复:]
没有WM_MENUSELECT吗?
WM_MENUSELECT消息的lParam参数是菜单句柄,wParam参数的低16位是菜单项索引值,GetMenuString可以得到菜单项文字。
[/Quote]

恩,划过的时候是有,但点击的时候貌似没得,不过得到了句柄,我可以枚举,然后通过鼠标点击的位置来定位某个菜单,呵呵,谢谢大家,谢谢cnzdgs
hydvivian 2009-11-09
  • 打赏
  • 举报
回复
m
zhyhchg 2009-11-09
  • 打赏
  • 举报
回复
gz
cnzdgs 2009-11-08
  • 打赏
  • 举报
回复
没有WM_MENUSELECT吗?
WM_MENUSELECT消息的lParam参数是菜单句柄,wParam参数的低16位是菜单项索引值,GetMenuString可以得到菜单项文字。
cnzdgs 2009-11-07
  • 打赏
  • 举报
回复
只要是菜单(包括窗口主菜单、系统菜单、上下文菜单)都适用,如果是应用程序自己模拟的菜单当然就不行了。
Lings 2009-11-07
  • 打赏
  • 举报
回复
to cnzdgs :

_____________________________

你说的是针对标准的窗体菜单和系统菜单。。。
cnzdgs 2009-11-07
  • 打赏
  • 举报
回复
菜单句柄通常是没用的,可以通过WM_INITMENUPOPUP获得。
cnzdgs 2009-11-07
  • 打赏
  • 举报
回复
右键菜单是属于哪个窗口或控件的,消息就发给该控件,WM_COMMAND消息。
cnzdgs 2009-11-07
  • 打赏
  • 举报
回复
根据菜单项的ID值判断,就是wParam的值。
Lings 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 muhuohacker 的回复:]
引用 11 楼 programmerno1 的回复:
引用 4 楼 kmmqq 的回复:
我把问题再说一下吧:

一个窗口,在里面点击右键,会弹出一个菜单,我想知道这个菜单的句柄,如何获得啊?

GetMenu是获取窗口的主菜单的句柄;
GetSystemMenu是获取窗口的系统菜单的句柄(如关闭、最大化等);

我该如何获取窗口的右键菜单的句柄呢????

大侠们支招啊!!感激


你这个菜单是先前创建好的,还是你想通过windows消息就能让其有系统菜单弹出?

这个说的是不错,问题说清楚!
[/Quote]

这个右键菜单是系统的,你在桌面上点右键,不是会弹出一个菜单么?
点击一个选项,如“刷新”,我可以通过WM_COMMAND获取菜单的ID,但是我不知道那整个菜单的句柄,所以没法获取点击的是“刷新”按钮,我要获取“刷新”这两个汉字!!!!
muhuohacker 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 programmerno1 的回复:]
引用 4 楼 kmmqq 的回复:
我把问题再说一下吧:

一个窗口,在里面点击右键,会弹出一个菜单,我想知道这个菜单的句柄,如何获得啊?

GetMenu是获取窗口的主菜单的句柄;
GetSystemMenu是获取窗口的系统菜单的句柄(如关闭、最大化等);

我该如何获取窗口的右键菜单的句柄呢????

大侠们支招啊!!感激


你这个菜单是先前创建好的,还是你想通过windows消息就能让其有系统菜单弹出?
[/Quote]
这个说的是不错,问题说清楚!
ProgrammerNO1 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kmmqq 的回复:]
我把问题再说一下吧:

一个窗口,在里面点击右键,会弹出一个菜单,我想知道这个菜单的句柄,如何获得啊?

GetMenu是获取窗口的主菜单的句柄;
GetSystemMenu是获取窗口的系统菜单的句柄(如关闭、最大化等);

我该如何获取窗口的右键菜单的句柄呢????

大侠们支招啊!!感激
[/Quote]

你这个菜单是先前创建好的,还是你想通过windows消息就能让其有系统菜单弹出?
chajishangdekouzi 2009-11-07
  • 打赏
  • 举报
回复
感觉两次说的问题不是一个
Lings 2009-11-06
  • 打赏
  • 举报
回复
我把问题再说一下吧:

一个窗口,在里面点击右键,会弹出一个菜单,我想知道这个菜单的句柄,如何获得啊?

GetMenu是获取窗口的主菜单的句柄;
GetSystemMenu是获取窗口的系统菜单的句柄(如关闭、最大化等);

我该如何获取窗口的右键菜单的句柄呢????

大侠们支招啊!!感激
Lings 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bowfnfje 的回复:]
用MSAA获取非常方便!
[/Quote]

大哥,我不知道那个MSAA是什么东西,能有详细的用法不?
bowfnfje 2009-11-06
  • 打赏
  • 举报
回复
用MSAA获取非常方便!
_JeffreyWu 2009-11-06
  • 打赏
  • 举报
回复
你直接HOOK WM_LBUTTONDOWN得了。。
鼠标一按下你就开始检查是点了什么,貌似这样不太符合你的意思。
UP一下吧。

15,471

社区成员

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

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