;运行效果
;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
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>