当前位置: 首页 > news >正文

win32汇编环境,加速键的应用示例

;运行效果

;win32汇编环境,加速键的应用示例
;加速键,就是按某个键,开启某个功能。不用鼠标点来点去的东西。
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
include      windows.inc 
include      user32.inc
include      kernel32.inc 
 
includelib   user32.lib           
includelib   kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       

; Equ 等值定义
IDC_VALUEA01  equ 201     ;静态控件标识符 

IDA_MAIN      equ 2000
IDA_01        equ 2001  
IDA_02        equ 2002
IDA_03        equ 2003
IDA_04        equ 2004                                         
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                                   
ClassName   db "SimpleWinClass",0        
AppName     db "窗口程序的模版",0

szMsg       db "提示",0 
szA01       db "按下了 F1 键",0 
szA02       db "按下了 D 键 ",0
szA03       db "按下了 CTRL+ALT+B 键",0
szA04       db "按下了 ALT+F 键",0

szSTClassName       db "static",0                   ;静态控件类名    

szSTCaptionA01      db "按一下 F1 键试试",13,10,13,10
                    db "按一下 D 键试试[英文输入法状态下]",13,10,13,10
                    db "按一下 CTRL+ALT+B 键试试",13,10,13,10
                    db "按一下 ALT+F 键试试",0    

.DATA?                                  
hInstance HINSTANCE  ?                
CommandLine LPSTR    ?   

hID_VALUECA01  dd    ?                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.CODE                      

start:                      
invoke GetModuleHandle, NULL                                                    
mov hInstance,eax 
invoke GetCommandLine                                                                                       
mov CommandLine,eax 
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT        
invoke ExitProcess, eax                                          
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
        LOCAL wc:WNDCLASSEX                                          
        LOCAL msg:MSG 
        LOCAL hwnd:HWND 
        
        LOCAL    @hAccelerator

        mov   wc.cbSize,SIZEOF WNDCLASSEX                            
        mov   wc.style, CS_HREDRAW or CS_VREDRAW                     
        mov   wc.lpfnWndProc, OFFSET WndProc                        
        mov   wc.cbClsExtra,NULL 
        mov   wc.cbWndExtra,NULL 
        push  hInstance 
        pop   wc.hInstance 
        mov   wc.hbrBackground,COLOR_WINDOW 
        mov   wc.lpszMenuName,NULL 
        mov   wc.lpszClassName,OFFSET ClassName 
        invoke LoadIcon,NULL,IDI_APPLICATION                          
        mov   wc.hIcon,eax 
        mov   wc.hIconSm,eax 
        invoke LoadCursor,NULL,IDC_ARROW                              
        mov   wc.hCursor,eax 
        invoke    LoadAccelerators,hInstance,IDA_MAIN             ;加载加速键表
    mov   @hAccelerator,eax
        invoke RegisterClassEx, addr wc                              
        invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,400,280, NULL,NULL,hInst, NULL 
        mov   hwnd,eax 
        invoke ShowWindow, hwnd,CmdShow                              
         invoke UpdateWindow, hwnd                                    

        .while TRUE                                                   
                invoke GetMessage, ADDR msg,NULL,0,0 
                .break .if (!eax) 
                invoke    TranslateAccelerator,hwnd,@hAccelerator,addr msg   ;在消息循环中截取加速键,再进行转换发送到窗口函数中处理
                .if eax == 0                                               ;如果没有加速键的内容,则按原来的进行消息处理
                    invoke TranslateMessage, ADDR msg 
                        invoke DispatchMessage, ADDR msg 
                .endif
                
        .endw 
        mov     eax,msg.wParam                                         
        ret 
WinMain endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
        .if uMsg == WM_CREATE
            invoke CreateWindowEx,NULL,ADDR szSTClassName,ADDR szSTCaptionA01, WS_CHILD + WS_VISIBLE,80, 50, 250, 150,hWnd,IDC_VALUEA01,NULL,NULL    ;创建静态控件,用来显示刻度                                                             
                mov hID_VALUECA01,eax
        .elseif uMsg == WM_DESTROY                                           
                invoke PostQuitMessage,NULL 
        .elseif    uMsg ==    WM_COMMAND
                mov eax,wParam
                .if ax == IDA_01
                    invoke MessageBox,NULL,addr szA01,addr szMsg,MB_OK
                .elseif ax == IDA_02
                    invoke MessageBox,NULL,addr szA02,addr szMsg,MB_OK
                .elseif ax == IDA_03
                    invoke MessageBox,NULL,addr szA03,addr szMsg,MB_OK
                .elseif ax == IDA_04
                    invoke MessageBox,NULL,addr szA04,addr szMsg,MB_OK            
                .endif                                      
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start      

;以下是Rc资源文件的内容                                               

#include        <resource.h>

#define    IDA_MAIN 2000    //加速键
#define    IDA_01   2001
#define    IDA_02   2002
#define    IDA_03   2003
#define    IDA_04   2004

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDA_MAIN    accelerators        ;这个是加速键表,前面用时可以加载进去
BEGIN
        VK_F1,    IDA_01,    VIRTKEY
        "D",    IDA_02,    VIRTKEY
        "B",    IDA_03,VIRTKEY,CONTROL,ALT
        "F",    IDA_04,VIRTKEY,ALT
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

相关文章:

  • C++模板与STL七日斩:从工业编程到高效数据管理(工业项目)
  • 纷析云:赋能企业财务数字化转型的开源解决方案
  • React 源码揭秘 | 更新队列
  • 28.C++多态1 (多态的概念与简单使用,虚函数,final,override)
  • linux--多进程开发(5)--进程
  • C/C++ | 每日一练 (4)
  • Linux:基础IO
  • 使用 pytest-mock 进行 Python 高级单元测试与模拟
  • 为什么MySQL选择使用B+树作为索引结构
  • 51串口通信实例(蓝牙模块和WiFi模块的介绍和使用)
  • 什么是零拷贝?
  • 模型蒸馏与量化技术:让AI模型“瘦身”却不“降智”的底层逻辑
  • Windows Server 搭建 RADIUS 认证服务器
  • 解决安卓recyclerView滚到底部不彻底问题
  • LeetCode每日精进:622.设计循环队列
  • Linux 病毒扫描工具 ClamAV 使用
  • 4*A100 部署 deepseek-r1-671B
  • Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案
  • Web自动化之Selenium下Chrome与Edge的Webdriver常用Options参数
  • 【中等】59.螺旋矩阵Ⅱ
  • 腾讯布局智能体开发平台,吴运声:智能体行业增长很快,仍处于百花齐放阶段
  • 日本农林水产大臣因不当“大米言论”引咎辞职
  • 兴业证券:下半年A股指数稳、结构牛,中国资产重估刚刚开始
  • 不止是生态优势,“浙江绿谷”丽水有活力
  • 专家:炎症性肠病发病率上升,需加强疾病早期诊断
  • 瑞幸首度牵手成都国际非遗节,用一杯饮品将非遗之美推向全国