Windows 窗口消息(一)

参考微软的官方文档,和自己写的实例,来了解加实践一下Windows的各种窗口消息。

WM_CREATE

在调用CreateWindow创建窗口时,直接调用窗口过程,并传递该消息。堆栈如下:

LPARAM:指向一个CREATESTRUCT结构体的指针,里面包含创建窗口相关的信息

返回值:正常返回0。如果返回-1窗口不会被创建出来,CreateWindow返回NULLGetLastError没有错误信息。传递-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

返回值:文本长度,不包括结尾的结束字符

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据