Windows 创建窗口(模块、模块句柄、实例、进程)

本文介绍了在Windows环境下创建窗口的过程,重点讲解了模块句柄、实例和进程的区别。首先,获取窗口的模块句柄,它是窗口的上级,不同于进程ID。一个进程由多个模块组成,如主执行文件和user32.dll等。窗口属于某个特定的模块,通常是主执行文件的模块。接着,注册窗口类,指定窗口所属的模块和窗口过程。最后,详细阐述了创建并显示窗口的步骤,包括设置窗口属性,并通过窗口句柄进行后续操作。

注册一个窗口代码:

  1. 首先要获取该窗口的“上级”,即属于哪一个模块。
    1. 这里获取的是 模块句柄,也是实例,不是进程ID。窗口的上级并不是进程,而是模块。
    2. 一个进程由很多模块组成,比如执行文件 xx.exe模块,但光这一个模块不够,还需要 user32.dll模块等等,这些很多模块共同组成一个进程,而程序的主逻辑代码存储在 xx.exe模块中。
    3. 所以,我们获取的是这个 xx.exe句柄,因为我们在这个 xx.exe模块中创建的窗口,所以,窗口理应属于这一个模块中。
    4. 实例,以后我们就认为是“模块句柄”就好,这是16位遗留下来的东西,我们不用过多纠结。
    在这里插入图片描述
invoke	GetModuleHandle,NULL
		mov	hInstance,eax
  1. 注册窗口类
    1. 主要告诉windows操作系统,其所属的上级是谁,让其分发消息时别分错了。
    2. 还告诉操作系统,窗口过程 是谁。
    3. 这些内容都在 内核中有记录,其实 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
  1. 创建并显示窗口
    1. 创建窗口步骤主要告诉操作系统,创建的窗口的长宽高等属性。
    2. 创建完成之后,返回一个窗口句柄,所以,以后我们对窗口的展示或者对窗口内容的更改就可以使用这个句柄。
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值