阿科 发表于 2014-1-9 19:37:05

关于WM_SYSCOMMAND消息的问题

老师:
       在学习小甲鱼老师的<<Win32汇编语言程序设计>>第40讲的时候发现一个问题,在讲课中提到如果把一个菜单添加到了系统菜单,那选中它之后,Windows向窗口发送的是WM_SYSCOMMAND消息,而非WM_COMMAND消息.
       于是我把小甲鱼的课件程序修改了一下,但是发现这个被添加到系统菜单的菜单项选中时并不像预期的那样触发WM_SYSCOMMAND消息,而还是和以前一样触发的WM_COMMAND消息,这是为什么呢?
      但是系统默认的系统菜单是可以正常触发WM_SYSCOMMAND消息的,难道非系统默认的菜单就不行吗?
......
.elseif        eax ==        WM_COMMAND                       ; 这个消息始终能够被触发
                        invoke        _DisplayMenuItem,wParam
                        mov        eax,wParam
                        movzx        eax,ax

.......
;        在系统菜单中添加菜单项
;********************************************************************
                        invoke        GetSystemMenu,hWnd,FALSE
                        mov        @hSysMenu,eax
                        invoke        AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
                        invoke        AppendMenu,@hSysMenu,NULL,IDM_HELP,offset szMenuHelp
                        invoke        AppendMenu,@hSysMenu,NULL,IDM_ABOUT,offset szMenuAbout


.......
elseif        eax == WM_SYSCOMMAND
                        mov        eax,wParam
                        movzx        eax,ax
                        .if        eax == IDM_HELP || eax == IDM_ABOUT
                                ; invoke        _DisplayMenuItem,wParam
                                invoke        MessageBox,hWinMain,offset szMenuHelp,offset szCaption,MB_OK                                       ; 这一句是我添加的,目的是为了区别WM_COMMAND消息产生的结果,但是程序始终没有调用这一句.

       .else
                        ........      

lenovolty 发表于 2014-1-9 19:37:06

这已经成功添加了,但可能是你点击的菜单不对,不是点击菜单栏的帮助了,而是如下图:

向往青莲 发表于 2014-1-11 15:19:27

WM_SYSCOMMAND ---》 WindowsMessage_SystemCommand
WM_COMMAND -------》 WindowsMessage_Command

所以肯定是系统菜单啦
自定义菜单要用WM_COMMAND

MSDN 没看。。不过应该也是这样

阿科 发表于 2014-1-11 18:15:22

向往青莲 发表于 2014-1-11 15:19 static/image/common/back.gif
WM_SYSCOMMAND ---》 WindowsMessage_SystemCommand
WM_COMMAND -------》 WindowsMessage_Command



但是我已经用下面的方法:
invoke      AppendMenu,@hSysMenu,NULL,IDM_HELP,offset szMenuHelp
invoke      AppendMenu,@hSysMenu,NULL,IDM_ABOUT,offset szMenuAbout
把HELP和ABOUT两个子菜单添加到了系统菜单啊,为什么选中的时候不能发出"WM_SYSTEMCOMMAND"消息呢?它只能发出"WM_COMMAND"消息

向往青莲 发表于 2014-1-11 18:48:15

阿科 发表于 2014-1-11 18:15 static/image/common/back.gif
但是我已经用下面的方法:
invoke      AppendMenu,@hSysMenu,NULL,IDM_HELP,offset szMenuHelp
invo ...

把    invoke      GetSystemMenu,hWnd,FALSE
改为 invoke      GetSystemMenu,hWnd,TRUE
试试

阿科 发表于 2014-1-11 19:35:41

向往青莲 发表于 2014-1-11 18:48 static/image/common/back.gif
把    invoke      GetSystemMenu,hWnd,FALSE
改为 invoke      GetSystemMenu,hWnd,TRUE
试试

  这个方法还是不行.我后来也查了MSDN,必须用FALSE做参数才能够修改系统菜单(能够往里面加菜单),如果设置为TRUE,则不能对系统菜单进行修改,所以这个方法不能达到目的.
  请高手再次指点一下如何做,如果需要原程序,附件里有.

1236 发表于 2014-1-12 23:30:38

下载下来看了下,右键没发现你所添加的系统菜单项啊

阿科 发表于 2014-1-13 09:01:46

添加系统菜单一定要加到右键的消息里吗?
程序中我已经用了:
invoke      GetSystemMenu,hWnd,FALSE
mov      @hSysMenu,eax
invoke      AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
invoke      AppendMenu,@hSysMenu,NULL,IDM_HELP,offset szMenuHelp
invoke      AppendMenu,@hSysMenu,NULL,IDM_ABOUT,offset szMenuAbout
这种方式添加进系统菜单,难道还不行吗?愿闻其详!

lenovolty 发表于 2014-1-27 16:37:47

书上是这样说的,你可以好好看看:

阿科 发表于 2014-1-28 11:48:26

lenovolty 发表于 2014-1-9 19:37 static/image/common/back.gif
这已经成功添加了,但可能是你点击的菜单不对,不是点击菜单栏的帮助了,而是如下图:

听君一席话,胜读十年书啊,真是感谢啊
页: [1]
查看完整版本: 关于WM_SYSCOMMAND消息的问题