参考微软的官方文档,和自己写的实例,来了解加实践一下Windows的各种窗口消息。
WM_CREATE
在调用CreateWindow
创建窗口时,直接调用窗口过程,并传递该消息。堆栈如下:
LPARAM:指向一个CREATESTRUCT
结构体的指针,里面包含创建窗口相关的信息
返回值:正常返回0。如果返回-1窗口不会被创建出来,CreateWindow
返回NULL
,GetLastError
没有错误信息。传递-1和0以外的数效果似乎与0相同,文档没有描述行为
WM_DESTROY
窗口被销毁时发送。收到消息时,窗口已经不可见。
返回值:0
WM_SIZE
窗口被移动后发送。创建时也会收到。
LOWORD(LPARAM)
:客户区左上角X坐标
HIWORD(LPARAM)
:客户区左上角Y坐标
返回值:0
WM_ACTIVATE
窗口被激活或取消激活后发送。 创建时也会收到。
LOWORD(WPARAM)
:1激活,2鼠标点击激活,3取消激活
HIWORD(WPARAM)
:不为0,窗口被最小化,否则未最小化
LPARAM:如果窗口被激活,则为被取消激活窗口的句柄。否则是被激活窗口的句柄。可能是NULL。(好像只能是同线程的窗口)
返回值:0
WM_SETFOCUS
窗口获得键盘焦点后发送。 创建时也会收到。
WPARAM:失去键盘焦点的窗口句柄。 可能是NULL。(好像只能是同线程的窗口)
返回值:0
WM_KILLFOCUS
失去键盘焦点之前发送
WPARAM:获得键盘焦点的窗口句柄。 可能是NULL。(表示没拿到过非NULL的值)
返回值:0
WM_ENABLE
窗口被禁用或启用前发送。EnableWindow
返回前,WS_DISABLED
改变后。
如果直接更改WS_DISABLED
样式,窗口会被启用或禁用,但不会收到该消息。
WPARAM:TRUE
启用,FALSE
禁用
返回值:0
WM_SETREDRAW
启用或禁用窗口重绘。通过挂起WM_PAINT
实现。
按照默认的行为,当窗口重绘被禁用后,会变得无法操作,鼠标会直接穿透到下面,任务栏不显示该窗口,任务视图不显示该窗口 ,任务管理器也不显示该窗口。启用后会恢复。文档没有解释过这个行为。
根据泄露的Windows XP源代码来看,这个消息默认的行为主要是改变窗口的WS_VISIBLE样式,根据实测效果几乎一样。但这个穿透效果是不靠谱的,在某些环境下,触摸不会穿透到当前窗口下方的UWP或Chrome窗口。官方源码里的注释如下:
* This routine sets/resets the VISIBLE flag for windows who don't want any
* redrawing. Although a fast way of preventing paints, it is the apps
* responsibility to reset this flag once they need painting. Otherwise,
* the window will be rendered transparent (could leave turds on the
* screen).
WPARAM:TRUE
启用,FALSE
禁用
返回值:0
WM_SETTEXT
设置窗口的文本(标题或内容等)
LPARAM:文本内容
返回值:TRUE
成功,或FALSE
等其他错误
WM_GETTEXT
获取窗口的文本,拷贝到调用者提供的缓冲区中
WPARAM:最大长度,包括结尾的结束字符
LPARAM:指向缓冲区的指针
返回值:拷贝的字符数,不包括结尾的结束字符
WM_GETTEXTLENGTH
获取窗口的文本的长度
WPARAM:0
LPARAM:0
返回值:文本长度,不包括结尾的结束字符