首页
社区
课程
招聘
[原创]Win32窗口创建和消息处理小程序(MASM 附源代码)
发表于: 2007-2-6 13:01 9208

[原创]Win32窗口创建和消息处理小程序(MASM 附源代码)

2007-2-6 13:01
9208

Author: Jacky Chou

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;WinMain_Asm.Inc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386                         ;
.model flat,stdcall          ;       
option casemap:none	     ;这3条不用说了

include windows.inc	     ;需要包含的头文件和库文件
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
include comctl32.inc
includelib comctl32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;WinMain_Asm.Asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include WinMain_Asm.inc

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD   ;WinMain函数的申明

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Data Segment --- initialized data
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data
WndClassName db "MyFirstWin",0          ;类名
WndAppName   db "WinMainTest",0		;窗口名
MsgText      db "hello JackyChou",0	;消息内容
MsgCaption   db "Hello",0		;消息标题
btnkeyinfo   db "You Have Entered Key ",?,0 	
char         db "%c",0
LButtonDown  db "Left Button clicked!",0
RButtonDown  db "Right Buttond clicked!",0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Data Segment --- Uninitialized data 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance  HINSTANCE ?	;句柄 在Win32下,应用程序的句柄和模块的句柄是一样的。您可以把实例句柄看成是您的应用程序的 ID 号。
CommandLine LPSTR ?


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Code Segment
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle,NULL	;获取我们应用程序的句柄
mov hInstance,eax
invoke GetCommandLine	;您的应用程序不处理命令行那么就无须调用 GetCommandLine,这里只是告诉您如果要调用应该怎么做。
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWNORMAL		;调用WinMain函数
invoke ExitProcess,eax						;退出我们的程序,退出代码是从WinMain函数返回的EAX

WinMain proc hInStance:HINSTANCE,hPreInstance:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

	LOCAL hWnd:HWND			;创建局部变量
	LOCAL msg:MSG
	LOCAL myWndClass:WNDCLASS
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口类是一个结构题,我们只要像做填空题一样,把结构体中需要填写的内容全部进行相应赋值就可以了。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	mov myWndClass.style,CS_HREDRAW or CS_VREDRAW
	mov myWndClass.lpfnWndProc,offset myWndProc
	mov myWndClass.cbClsExtra,NULL
	mov myWndClass.cbWndExtra,NULL
	push hInStance
	pop myWndClass.hInstance
	invoke LoadIcon,NULL,IDI_WINLOGO    ;装载图标
	mov myWndClass.hIcon,eax
	invoke LoadCursor,NULL,IDC_HAND     ;装载光标
	mov myWndClass.hCursor,eax
	invoke GetStockObject,WHITE_BRUSH
	mov myWndClass.hbrBackground,eax       ;背景
	mov myWndClass.lpszMenuName,NULL
	mov myWndClass.lpszClassName,offset WndClassName    
	
	invoke RegisterClass,addr myWndClass             ;注册窗口
	invoke CreateWindowEx,NULL,\			;创建窗口
	                      addr WndClassName,\
	                      addr WndAppName,\
	                      WS_OVERLAPPEDWINDOW, \           ;and (not WS_MAXIMIZEBOX),\  ;如何去除一个其中一个选项
	                      CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
	                      NULL,\
	                      NULL,\
	                      hInStance,\
	                      NULL 
	mov hWnd,eax
	invoke ShowWindow,hWnd,SW_SHOWNORMAL		;显示窗口
	invoke UpdateWindow,hWnd
	
	.while TRUE					;循环处理消息
		invoke GetMessage,addr msg,NULL,0,0
		invoke TranslateMessage,addr msg
		invoke DispatchMessage,addr msg
	.endw
	mov eax,msg.wParam
	ret

WinMain endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;消息处理部分
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
myWndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
	
	LOCAL ps:PAINTSTRUCT
	LOCAL hDc:HDC	
	.if uMsg == WM_DESTROY                  ;窗口销毁消息          
		invoke PostQuitMessage,0
	.elseif uMsg == WM_PAINT                  ;重画消息
	  	invoke BeginPaint,hWnd,addr ps
	  	invoke GetDC,hWnd
	  	mov hDc,eax
	  	invoke TextOut,hDc,0,0,addr MsgText,(sizeof MsgText)-1
	  	invoke ReleaseDC,hWnd,hDc
	  	invoke EndPaint,hWnd,addr ps
	.elseif uMsg == WM_KEYDOWN                 ;键盘键按下消息
		.if wParam == VK_F8		   ;F8关闭程序,相当于给程序留一个关闭的后门
			invoke ExitProcess,0
		.endif
		invoke wsprintf,addr btnkeyinfo+21,addr char,wParam      ;参考wsprintf的用法
		invoke MessageBox,hWnd,addr btnkeyinfo,addr MsgCaption,MB_OK
        .elseif uMsg == WM_LBUTTONDOWN                ;鼠标左键按下消息
	        invoke MessageBox,hWnd,addr LButtonDown,addr MsgCaption,MB_OK
	.elseif uMsg == WM_RBUTTONDOWN                ;鼠标右键按键消息
		invoke MessageBox,hWnd,addr RButtonDown,addr MsgCaption,MB_OK
	.elseif uMsg == WM_CLOSE                     ;关闭消息
	        invoke ExitProcess,0
	.else 
	        invoke DefWindowProc,hWnd,uMsg,wParam,lParam              ;默认处理
	        ret
	.endif
	xor eax,eax
	ret

myWndProc endp
end start

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
虽然基础,但详细,很适合初学者学习。
2007-2-6 13:41
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
最初由 JackyChou 发布
以上代码 经RadASM编译通过,测试成功! (程序只有4K) 我用VC++ Win32 Application 做一个完全一样功能的程序,要168K,果然汇编牛啊


是不是"168K"的"1"后面忘写小数点了?
2007-2-6 13:54
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 dwing 发布
是不是"168K"的"1"后面忘写小数点了?


DEBUG 168K
Release  小很多 只有36K
2007-2-6 14:00
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
最初由 JackyChou 发布
DEBUG 168K
Release 小很多 只有36K


标 题:怎样使用 Visual C++ 编译出只有 1536 字节的窗口程序
http://www.pediy.com/bbshtml/BBS5/pediy50453.htm
2007-2-6 19:30
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 dwing 发布
标 题:怎样使用 Visual C++ 编译出只有 1536 字节的窗口程序
http://www.pediy.com/bbshtml/BBS5/pediy50453.htm


我用该代码编译过了,程序8K
回调函数只有退出消息


case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return(DefWindowProc(hWnd, uMsg, wParam, lParam));

MASM32  关闭窗口后,程序仍旧在运行,进程中可以看到。
2007-2-6 20:18
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
最初由 JackyChou 发布
我用该代码编译过了,程序8K


如果使用VC6,就要把这行的注释去掉.
//#pragma comment(linker, "/OPT:NOWIN98")

最初由 JackyChou 发布
回调函数只有退出消息
MASM32 关闭窗口后,程序仍旧在运行,进程中可以看到。


那个程序写的不太完善,但添加和修改几行代码,不会多几K的.
另外最好在编译选项里选最小代码优化.
有兴趣可以对比一下VC编译后的代码和你自己写的代码,看谁的更短.
2007-2-7 11:44
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我看过 罗云彬的书,第一个窗口程序
2007-2-7 16:24
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
9
VC6
3K
上传的附件:
2007-2-7 17:19
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
10
VC6加上nowin98
1.76K
上传的附件:
2007-2-7 17:23
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
11
深入Win32k.SYS讲讲
2007-2-7 18:34
0
游客
登录 | 注册 方可回帖
返回
//