Win32汇编中关于WM_COMMAND消息中wParam的问题

zuchen 2009-05-22 09:58:40
在罗云彬那本书里说WM_COMMAND消息中wParam参数的低16位是命令ID,高16位是通知码,菜单消息的通知码是0加速键的消息的通知码是1所以需要 mov eax, wParam 然后movzx eax, ax来扩展高位冲掉通知码以便用相同代码处理加速键和菜单消息,可是我直接用eax没有扩展却依然可以同时处理菜单键和加速键 我认为wParam的高16位不管是菜单还是加速键都是一致的
这是书上的bug吗?
...全文
194 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuchen 2009-05-23
  • 打赏
  • 举报
回复
对 直接用快捷键发送菜单的ID
这个有问题么?
  • 打赏
  • 举报
回复
原来是这样子啊。。我说呢。BUTTON CLICK的时候,高16位,也是,0,只有低16位是,111。跟他说的不一样。
cnzdgs 2009-05-23
  • 打赏
  • 举报
回复
你是用菜单或者工具栏试验的吧?
killbug2004 2009-05-23
  • 打赏
  • 举报
回复
我用spy++记录notepad的WM_COMMAND消息
<00006> 000E1D12 P WM_COMMAND wNotifyCode:0 (从菜单发送) wID:1 [wParam:00000001 lParam:00000000]=======>鼠标选择新建菜单
<00007> 000E1D12 S WM_COMMAND wNotifyCode:1 (从快捷键发送) wID:25 [wParam:00010019 lParam:00000000]====>ctrl+a全选快捷键

这里的加速键(快捷键)是指通过资源定义的 然后在窗口创建过程中LoadAccelerators,在消息循环时TranslateAccelerator转换,这时就可以在窗口过程回调函数中捕获到该加速键消息,通知码为1

而菜单加速键与这不同,系统捕获系统自己转换为对应的菜单项,然后系统以WM_COMMAND消息的形式通知程序,此时的通知码为0作为菜单消息发送,与上面的加速键消息不同
zuchen 2009-05-23
  • 打赏
  • 举报
回复
有解决了 我把WINDOW + 1 强制转换成HBRUSH了
zuchen 2009-05-23
  • 打赏
  • 举报
回复
试了无数次总算知道点眉目了
我开始用hAccelerator = LoadAccelerators(hInstance,IDA_MAIN)载入快捷键但是有一个warning说这个函数的第二个参数类型不正确 IDA_MAIN是数字定义的资源后来加上MAKEINTRESOURCE(IDA_MAIN)把IDA_MAIN强制转换了一下结果OK了 没有warning了观察wParam的值也正确了
原来是参数问题
这个问题Over
还有一个warning是说stWndClass.hbrBackground = COLOR_WINDOW + 1;
“=”: “HBRUSH”与“int”的间接级别不同 这个怎么把COLOR_WINDOW + 1转换啊
现在测试用的是C
zuchen 2009-05-23
  • 打赏
  • 举报
回复
我用的是通过资源定义的 然后在窗口创建过程中LoadAccelerators,在消息循环时TranslateAccelerator转换的那种 不是字母前面加&的那种 按理说应该高位为1
xiaopoy 2009-05-23
  • 打赏
  • 举报
回复
强制转换了。(?)
cnzdgs 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zuchen 的回复:]
对 直接用快捷键发送菜单的ID
这个有问题么?
[/Quote]
快捷键与加速键是不同的。例如“文件”菜单中的“新建”命令,用Alt+F+N是该菜单的快捷键,Ctrl+N才是加速键。快捷键相当于点击菜单项,wParam高WORD为0;加速键是指令产生某个ID的命令,wParam高WORD为1,加速键不一定要有对应的菜单项。
zuchen 2009-05-22
  • 打赏
  • 举报
回复
我直接用.if eax == wParam 没有处理高16位情况 也可以处理加速键
另外我用C做了测试直接
switch(wParam)
{
IDM_TEXT:...
break;
....
}
也成功 也就是说程序没有比较高位情况但是这不应该啊
cnzdgs 2009-05-22
  • 打赏
  • 举报
回复
加速键的消息的通知码是1没错,你的代码是怎么写的?
另外提一下,mov eax, wParam 然后movzx eax, ax这种做法比较麻烦,直接用ax判断即可。
zuchen 2009-05-22
  • 打赏
  • 举报
回复
刚才看了下MSDN上面和罗云彬的书上是一样的
那我猜想是在比较我的菜单ID时只比较了低16位 高16位自动忽略了
但想不通 为什么会忽略?

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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