msgloop.asm

来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 130 行

ASM
130
字号
;******************************
;MsgLoop.asm                  *
;功能:演示注册window类及     *
;      建立Window和消息循环   *
;******************************
.386p
.model flat,stdcall
include win32.inc

extrn GetMessageA:proc
extrn TranslateMessage:proc
extrn DispatchMessageA:proc
extrn ShowWindow:proc
extrn UpdateWindow:proc
extrn CreateWindowExA:proc
extrn RegisterClassA:proc
extrn DefWindowProcA:proc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn LoadIconA:proc
extrn LoadCursorA:proc
extrn GetStockObject:proc
extrn GetModuleHandleA:proc
extrn PostQuitMessage:proc

;结构定义
POINT struc
	x dd ?
	y dd ?
	ends

MSG struc
    hwnd 	dd ?
    message	dd ?
    wParam	dd ?
    lParam	dd ?
    time	dd ?
    pt		POINT<>
    ends

WNDCLASS struc
	style		dd ?
	lpfnWndProc	dd ?
	cbClsExtra	dd ?
	cbWndExtra	dd ?
	hInstance	dd ?
	hIcon		dd ?
	hCursor		dd ?
	hbrBackground	dd ?
	lpszMenuName	dd ?
	lpszClassName	dd ?
	ends

.data	;数据
	Text		db 'Left ButtonDown',0
	myclassname	db 'MyClass',0			;窗口类名
	caption		db 'Message Loop',0		;窗口标题
	hInst		dd ?
	hWnd		dd ?
	align 4			;四字节对齐
	msg	MSG<>		;消息结构
	wc	WNDCLASS<>	;窗口类结构

.code	;代码
main:
	call	GetModuleHandleA,0		;取模块句柄
	mov		[hInst],eax
	
	mov		wc.lpszClassName,offset myclassname
	mov		eax,[hInst]
	mov		wc.hInstance,eax
	mov		wc.lpfnWndProc,offset WinMsgProc
	call	LoadIconA,0,IDI_APPLICATION
	mov		wc.hIcon,eax
	call	LoadCursorA,0,IDC_IBEAM
	mov		wc.hCursor,eax
	mov		wc.lpszMenuName,0
	call	GetStockObject,WHITE_BRUSH
	mov		wc.hbrBackground,eax
	mov		wc.style,CS_HREDRAW or CS_VREDRAW or CS_GLOBALCLASS
	mov		wc.cbClsExtra,0
	mov		wc.cbWndExtra,0
	;注册窗口类
	call	RegisterClassA,offset wc
	;建立主窗口
	call	CreateWindowExA,0,offset myclassname,offset caption,\
							WS_OVERLAPPEDWINDOW,	\
							100,100,450,300,0,0,	\
							[hInst],0
	mov		[hWnd],eax

	call	ShowWindow,[hWnd],1
	call	UpdateWindow,[hWnd]
;消息循环
MsgLoop:
	call	GetMessageA,offset msg,0,0,0
	or		eax,eax
	jz		Exit
	call	TranslateMessage,offset msg
	call	DispatchMessageA,offset msg
	jmp		MsgLoop
Exit:
	call ExitProcess,0		;退出进程
;**************************************************************************
;主窗口过程
WinMsgProc  proc uses ebx edi esi, handle:DWORD, wMsg:DWORD, wParam1:DWORD, lParam1:DWORD
	cmp		wMsg,WM_CREATE
	jz		create
	cmp		wMsg,WM_DESTROY
	jz		destory
	cmp		wMsg,WM_LBUTTONDOWN
	jz		lbuttondown
	jmp		default
create:			;窗口建立
	xor		eax,eax
	ret
destory:		;窗口注销
	call	PostQuitMessage,0
	xor		eax,eax
	ret
lbuttondown:	;鼠标单击
	call	MessageBoxA,handle,offset Text,offset caption,MB_OK
	xor		eax,eax
	ret
default:		;默认窗口处理过程
	call	DefWindowProcA,handle,wMsg,wParam1,lParam1
	ret
WinMsgProc  endp
	end main

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?