注册一个窗口代码:
- 首先要获取该窗口的“上级”,即属于哪一个模块。
1. 这里获取的是 模块句柄,也是实例,不是进程ID。窗口的上级并不是进程,而是模块。
2. 一个进程由很多模块组成,比如执行文件 xx.exe模块,但光这一个模块不够,还需要 user32.dll模块等等,这些很多模块共同组成一个进程,而程序的主逻辑代码存储在 xx.exe模块中。
3. 所以,我们获取的是这个 xx.exe句柄,因为我们在这个 xx.exe模块中创建的窗口,所以,窗口理应属于这一个模块中。
4. 实例,以后我们就认为是“模块句柄”就好,这是16位遗留下来的东西,我们不用过多纠结。
invoke GetModuleHandle,NULL
mov hInstance,eax
- 注册窗口类
- 主要告诉windows操作系统,其所属的上级是谁,让其分发消息时别分错了。
- 还告诉操作系统,窗口过程 是谁。
- 这些内容都在 内核中有记录,其实 user32.dll中的就是根据内核存储的记录来对应 消息的收发。
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
- 创建并显示窗口
- 创建窗口步骤主要告诉操作系统,创建的窗口的长宽高等属性。
- 创建完成之后,返回一个窗口句柄,所以,以后我们对窗口的展示或者对窗口内容的更改就可以使用这个句柄。
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain