首页
社区
课程
招聘
[求助]关于RadASM菜单快捷键的问题
发表于: 2006-11-21 14:57 5199

[求助]关于RadASM菜单快捷键的问题

2006-11-21 14:57
5199
罗的32位汇编书,第五章第一个例子菜单,在RadASM中,程序是照书上抄的,
可以构建运行,但就是菜单的快捷键做不出来,不知道怎么样在资源文件中定义?
我把程序都贴出来,各位大哥,帮我看下,是哪里错了?
用的是RadASM集成环境

.386
.model  flat,stdcall
option  casemap:none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;包含头文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include   windows.inc
include   user32.inc
include   kernel32.inc
includelib   user32.lib
includelib   kernel32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;equ  等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

IDM_MAIN     equ  2000
IDM_OPEN     equ  4101
IDM_OPTION   equ  4102
IDM_EXIT     equ  4103
IDM_SETFONT  equ  4201
IDM_SETCOLOR equ  4202
IDM_INACT    equ  4203
IDM_GRAY     equ  4204
IDM_BIG      equ  4205
IDM_SMALL    equ  4206
IDM_LIST     equ  4207
IDM_DETAIL   equ  4208
IDM_TOOLBAR  equ  4209
IDM_TOOLBARTEXT equ  4210
IDM_INPUTBAR    equ  4211
IDM_STATUSBAR   equ  4212
IDM_HELP        equ  4301
IDM_ABOUT       equ  4302

ID_ICO          equ  2000

IDA_MAIN          equ  2000
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data?

hInstance               dd          ?
hWinMain                dd          ?
hMenu                   dd          ?
hSubMenu                dd          ?
hAccelerator            dd          ?
.const

szClassName               db            'Menu  Example',0
szCaptionMain             db            '一个菜单例子程序',0
szMenuHelp                db            '帮助主题(&H)',0
szMenuAbout               db            '关于本程序(&A)',0
szCaption                 db            '菜单选择',0
szFormat                  db            '您选择了菜单命令:%08d',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

_DisplayMenuItem          proc        _dwCommandID
       
            LOCAL      @szBuffer[256]:byte
            
            pushad
            
            invoke     wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
            invoke     MessageBox,hWinMain,addr @szBuffer,offset szCaption,MB_OK
            
            popad
        ret

_DisplayMenuItem endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_Quit         proc
       
       
        invoke    DestroyWindow,hWinMain
        invoke    PostQuitMessage,NULL
       
        ret

_Quit endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcWinMain     proc    uses ebx edi esi hWnd,uMsg,wParam,lParam
       
        LOCAL   @stPos:POINT
        LOCAL   @hSysMenu
       
        mov    eax,uMsg
        .if    eax==WM_CREATE                ;>>>>>>>创建窗口所发的消息>>>>>>>>>>>>>>>>>>>>
                invoke  GetSubMenu,hMenu,1
                mov  hSubMenu,eax
                
                ;>>>>>>>>>>>在系统菜单中添加菜单项>>>>>>>>>>>>>>>>>>>>
                
                invoke   GetSystemMenu,hWnd,FALSE
                mov   @hSysMenu,eax
                invoke   AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
                invoke   AppendMenu,@hSysMenu,0,IDM_HELP,offset szMenuHelp
                invoke   AppendMenu,@hSysMenu,0,IDM_ABOUT,offset szMenuAbout
                
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
               
        .elseif  eax == WM_COMMAND   ;>>>>>命令消息>>>>>>>
                       
                        invoke  _DisplayMenuItem,wParam
                        mov   eax,wParam
                        movzx  eax,ax
                       
                        .if   eax ==  IDM_EXIT
                                call  _Quit
                       
                        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>处理打钩>>>>>>>>
                        
                        .elseif  eax >= IDM_TOOLBAR && eax <= IDM_STATUSBAR
                                 
                                 mov  ebx,eax   
                                 
                                 ;>>>>>>>>>>>>>>>得到菜单的状态函数>>>>>>>>>>>>>>>
                                 
                                 invoke  GetMenuState,hMenu,ebx,MF_BYCOMMAND     ;
                                 
                                 .if    eax == MF_CHECKED
                                        
                                         mov   eax,MF_UNCHECKED
                                 
                                 .else       
                                  
                                        mov   eax,MF_CHECKED
                                        
                                 .endif
               
                                 invoke        CheckMenuItem,hMenu,ebx,eax
                                 
                        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                       
                        ;>>>>>>>>>>>>处理打点>>>>>>>>>>>>>>
                       
                        .elseif        eax >= IDM_BIG && eax <= IDM_DETAIL
                       
                                invoke CheckMenuRadioItem,hMenu,IDM_BIG,IDM_DETAIL,eax,MF_BYCOMMAND       
                       
                        .endif
                       
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                       
        ;>>>>>>>>>>>>>>>>处理系统菜单消息>>>>>>>>>>>>>>>>>>>>>>>>>>>>
               
        .elseif  eax == WM_SYSCOMMAND
               
                        mov   eax , wParam
                        movzx  eax,ax
                        .if         eax == IDM_HELP || eax == IDM_ABOUT
                                
                                invoke _DisplayMenuItem,wParam
                          
                        .else   
                                invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                               
                                ret
                        
                        .endif       
               
                ;>>>>>>>>>>>>>>>>>>>>>处理右击时弹出的菜单>>>>>>>
               
                .elseif        eax == WM_RBUTTONDOWN
                       
                        invoke  GetCursorPos,addr @stPos
                       
                        invoke  TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
               
                ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
               
                .elseif        eax == WM_CLOSE
                       
                        call  _Quit
                       
                ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
               
                .else   
                       
                        invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                       
                        ret             ;>>>>>>>>>>>>在这个函数后要有ret>>>>>>>>>>
                       
                .endif
       
        xor  eax,eax
       
        ret

_ProcWinMain endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_WinMain           proc
       
                LOCAL  @stWndClass:WNDCLASSEX
                LOCAL  @stMsg:MSG
                               
                invoke  GetModuleHandle,NULL
                mov  hInstance,eax
               
                invoke  LoadMenu,hInstance,IDM_MAIN
                mov  hMenu,eax
               
                invoke  LoadAccelerators,hInstance,IDA_MAIN
                mov  hAccelerator,eax
               
        ;>>>>>>>>>>>>>>>注册窗口类>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       
        invoke  RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
        invoke  LoadIcon,hInstance,ID_ICO
        mov  @stWndClass.hIcon,eax
        mov  @stWndClass.hIconSm,eax
       
       
        mov @stWndClass.hInstance,offset hInstance
       
        mov @stWndClass.cbSize,sizeof WNDCLASSEX
        mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
        mov @stWndClass.lpfnWndProc,offset _ProcWinMain
        mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
        mov @stWndClass.lpszClassName,offset szClassName
       
        invoke  RegisterClassEx,addr @stWndClass
       
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>建立并显示窗口>>>>>>>>>>>>>>
       
        invoke  CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
                          WS_OVERLAPPEDWINDOW,100,100,400,300,NULL,hMenu,hInstance,NULL
                         
        mov   hWinMain,eax
       
        invoke  ShowWindow,hWinMain,SW_SHOWNORMAL
       
        invoke  UpdateWindow,hWinMain
       
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>消息循环>>>>>>>>>>>>>>>>>>
       
        .while  TRUE
               
                invoke  GetMessage,addr @stMsg,NULL,0,0
               
                .break  .if eax == 0
                       
                invoke  TranslateAccelerator,hWinMain,hAccelerator,addr @stMsg
               
                .if  eax == 0
                       
                        invoke  TranslateMessage,addr @stMsg
                        invoke  DispatchMessage,addr @stMsg
                       
                .endif
        .endw  
               
        ret

_WinMain endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:
           
            call   _WinMain
            invoke  ExitProcess,NULL
            
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

         end   start

资源文件是
#include "Res/munMnu.rc"

#define  ID_ICO 2000

ID_ICO ICON     "Tyrian.ICO"

那个菜单文件是:

#define IDM_MAIN 2000
#define IDM_OPEN 4101
#define IDM_OPTION 4102
#define IDM_EXIT 4103
#define IDM_SETFONT 4201
#define IDM_SETCOLOR 4202
#define IDM_INACT 4203
#define IDM_GRAY 4204
#define IDM_BIG 4205
#define IDM_SMALL 4206
#define IDM_LIST 4207
#define IDM_DETAIL 4208
#define IDM_TOOLBAR 4209
#define IDM_TOOLBARTEXT 4210
#define IDM_INPUTBAR 4211
#define IDM_STATUSBAR 4212
#define IDM_HELP 4301
#define IDM_ABOUT 4302
IDM_MAIN MENUEX
BEGIN
  POPUP "文件(&F)"
  BEGIN
    MENUITEM "打开文件(&O)...",IDM_OPEN
    MENUITEM "关闭文件(&C)...",IDM_OPTION
    MENUITEM "",,0x00000800
    MENUITEM "退出(&X)",IDM_EXIT
  END
  POPUP "查看(&V)"
  BEGIN
    MENUITEM "字体(&F)\tAlt+F",IDM_SETFONT
    MENUITEM "背景色(&B)\tAlt+Ctrl+B",IDM_SETCOLOR
    MENUITEM "",,0x00000800
    MENUITEM "被禁用的菜单项",IDM_INACT,,0x00000002
    MENUITEM "被灰化的菜单项",IDM_GRAY,,0x00000001
    MENUITEM "",,0x00000800
    MENUITEM "大图标(&G)",IDM_BIG
    MENUITEM "小图标(&M)",IDM_SMALL
    MENUITEM "列表(&L)",IDM_LIST
    MENUITEM "详细资料(&D)",IDM_DETAIL
    MENUITEM "",,0x00000800
    POPUP "工具栏(&T)"
    BEGIN
      MENUITEM "标准按钮(S&)",IDM_TOOLBAR
      MENUITEM "文字标签(&C)",IDM_TOOLBARTEXT
      MENUITEM "命令栏(&I)",IDM_INPUTBAR
    END
    MENUITEM "状态栏(&U)",IDM_STATUSBAR
  END
  POPUP "帮助(&H)",,0x00004000
  BEGIN
    MENUITEM "帮助主题(&H)\tF1",IDM_HELP
    MENUITEM "",,0x00000800
    MENUITEM "关于本程序(&A)",IDM_ABOUT
  END
END

问题是编出来的程序不能用快捷键?

用OD反汇编后,看到是根本没有得到快捷键句柄!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
看你的资源文件,你的资源文件还没有添加快捷键(Accel)资源。
2006-11-21 15:31
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
太感谢小虾版主了,问题已经解决了

我在资源文件中改成这样,就好了.

#include  "D:\RadASM\masm32\include\resource.h"

#include "Res/munMnu.rc"

#define  ID_ICO 2000
#define  IDA_MAIN 2000

ID_ICO ICON     "Tyrian.ICO"

IDA_MAIN  accelerators  

BEGIN
    VK_F1, IDM_HELP,VIRTKEY
    "B",   IDM_SETCOLOR,VIRTKEY,ALT,CONTROL
    "F",   IDM_SETFONT,VIRTKEY,ALT
END
2006-11-21 20:47
0
游客
登录 | 注册 方可回帖
返回
//