窗口的创建过程:
1).使用GetModulHandle获取窗口句柄
GetModuleHandle,lpModuleName
获取一个应用程序或动态链接库的模块句柄
lpModuleName参数是一个指向含有模块名字字符串的指针
如果返回成功,则返回模块句柄,存放在eax中。如果lpModuleName为NULL,则返回调用者本模块的句柄
2).注册窗口类
定义一个WNDCLAS***结构类型的变量,对其进行赋值,在调用RegisterClas***函数在系统中注册。
WNDCLAS***的结构定义如下:
WNDCLAS*** STRUCT
cbSize DWORD ? ;结构体的字节数我们可以用sizeof(WNDCLAS***)来获得准确的值
style DWORD ? ;窗口风格
lpfnWndProc DWORD ? ;窗口过程的地址
cbCl***tra DWORD ? ;紧跟在窗口类结构后边的字节数
cbWndExtra DWORD ? ;紧跟在窗口事例后的附加字节数
hInstance DWORD ? ;本模块的事例句柄
hIcon DWORD ? ;图标的句柄
hCursor DWORD ? ;光标的句柄
hbrBackground DWORD ? ;背景色
lpszMenuName DWORD ? ;指向类名称的指针
hIconSm DWORD ? ;小图标
WNDCLAS*** ENDS
RegisterClas*** lpClassName
lpClassName参数是窗口类的地址
3).建立窗口
CreateWindowEx, dwExstyle, lpClassName, lpWindowName, dwStyle,\
x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam
dwExstyle和dwStyle决定了窗口的外形和行为,dwStyle是win16开始就有点的属性,dwExstyle是win32中扩展的。
lpClassName:建立窗口使用的类名字符串指针。
lpWindowName:指向窗口名称的字符串。会显示在标题栏中。
x,y:指向窗口左上角位置,单位是像素
nWidth, nHeight:窗口的宽度和高度,单位是像素。
hWndParent:父窗口的句柄,若无父窗口,则为NULL
hMenu:窗口上要出现菜单的句柄。
hInstance:模块句柄,指定了窗口所属的程序模块。
lpParam:指针,指向一个欲传给窗口的参数
4).消息循环
;>>>>>>>>>消息循环
.while TRUE
invoke GetMessage, addr @stMsg,NULL, 0, 0
.break .if eax == 0
invoke TranslateMessage, addr @stMsg
invoke DispatchMessage, addr @stMsg
.endw
GetMessage:从消息队列中取出一条消息,准备处理
TranslateMessage:遇到键盘消息则将扫描码转换成ASCII码,否则不处理
DispatchMessage:将消息发送到窗口对应的窗口过程去处理。
窗口过程
WindowProc proc uses ebx edi esi, hWnd, uMsg, wParam, lParam
mov eax, uMsg
.if eax == WM_XXX
<处理WM_XXX消息>
.elseif eax == WM_YYY
<处理WM_YYY消息>
.elseif eax == WM_CLOSE
invoke DestroyWindow, hWinMain
invoke PostQuitMessage, NULL
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WindowProc endp
阅读(2148) | 评论(4) | 转发(0) |