win32消息类型

消息的产生与处理流程

  1. MSG 消息结构体
cpp 复制代码
typedef struct tagMSG {
HWND   hwnd;      //接收消息的窗口句柄
UINT   message;   //消息标识符,如WM_CREATE
WPARAM wParam;    //消息第一个附加参数
LPARAM lParam;    //消息第二个附加参数
DWORD  time;      //消息投递时间
POINT  pt;        //产生消息时鼠标光标坐标
} MSG;

● 整个结构体在GetMessage获取消息、DispatchMessage分发消息之间传递,完整保存消息全部信息

  1. 窗口过程 WndProc 参数对应关系

DispatchMessage(&msg)会把 MSG 结构体拆解,传给窗口过程函数

窗口过程参数 对应 MSG 结构体成员

窗口过程参数 对应 MSG 结构体成员
HWND hwnd MSG.hwnd
UINT uMsg MSG.message
WPARAM wParam MSG.wParam
LPARAM lParam MSG.lParam

调试技巧:用sprintf格式化uMsg消息编号,OutputDebugString输出到 VS 调试输出窗口,即使不操作窗口,系统也会自动产生大量系统消息:WM_CREATE、WM_SIZE、WM_MOVE等

  1. 基础系统消息列表
消息宏 十六进制值 触发时机
WM_NULL 0x0000 空消息
WM_CREATE 0x0001 窗口刚创建完成
WM_DESTROY 0x0002 窗口被销毁
WM_MOVE 0x0003 窗口发生移动
WM_SIZE 0x0005 窗口大小改变
WM_ACTIVATE 0x0006 窗口激活 / 失去激活

● 这类属于内核生成的系统消息,不需要用户操作就会自动产生

● 处理原则:自己关心的消息手动处理;其余全部交给DefWindowProc做系统默认处理

cpp 复制代码
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch(uMsg)
        {
            case WM_CREATE:
                //窗口初始化资源
                return 0;
            case WM_DESTROY:
                PostQuitMessage(0); //发送WM_QUIT,结束消息循环
                return 0;
            default:
                //未处理消息交给系统默认处理
                return DefWindowProc(hwnd,uMsg,wParam,lParam);
        }
}

⚠ WM_DESTROY 重点考点

● 用户点击窗口关闭按钮,会触发WM_DESTROY

● 必须调用PostQuitMessage(0),往消息队列放入WM_QUIT

● 如果漏掉这行:窗口看不见销毁了,进程仍然驻留在内存,任务管理器还能看到进程

  1. 消息命名规则

● 前缀WM_ = Windows Message,代表窗口消息

● 消息 ID 按功能分类编号

键盘相关消息

消息宏 十六进制值 说明
WM_KEYDOWN 0x0100 按键按下原始消息
WM_KEYUP 0x0101 按键松开原始消息
WM_CHAR 0x0102 字符消息,需要 TranslateMessage 转换才会产生
  1. WM_KEYDOWN
    ○ wParam:虚拟键码
    ○ lParam:32 位复合状态
    ■ 0‑15 位:按键重复计数
    ■ 第 30 位:按键之前的状态,1 代表之前已经按下
  2. WM_CHAR
    ○ wParam直接存放字符 ASCII 码,可以用%c打印字符
    ○ 只有调用TranslateMessage(&msg),才会把WM_KEYDOWN转换成WM_CHAR
    ○ 如果消息循环删掉TranslateMessage,程序永远收不到WM_CHAR
    重要提醒:不同消息下 wParam、lParam 含义完全不一样,不能凭记忆猜,要查阅 MSDN 文档
    例:WM_DESTROY中 wParam、lParam 无意义;WM_KEYDOWN中 wParam 是虚拟键码

完整消息流转链路

GetMessage取出消息 → TranslateMessage(键盘消息转换,生成WM_CHAR)→ DispatchMessage(拆解参数调用WndProc窗口过程)

总结

  1. DispatchMessage把 MSG 结构体拆成 4 个参数交给窗口过程
  2. 不写PostQuitMessage(0),窗口关闭但进程不会退出
  3. TranslateMessage的唯一作用:将原始按键消息转为字符消息WM_CHAR
  4. 所有 case 处理完毕,default 分支必须返回 DefWindowProc,否则窗口会出现异常行为
  5. 参数wParam、lParam含义随消息类型变化,没有通用含义,以 MSDN 为准
相关推荐
ppo_wu10 小时前
解决夸克网盘自动修改PDF打开方式的方法
经验分享·安全·网络安全
叼烟扛炮10 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
Thneonl21 小时前
桌宠穿透不是一行 SetWindowLong
windows·程序员
kingx31 天前
Bugku 逆向 MatrixHunter:黑盒 oracle + GF(2) 消元出唯一解
网络安全·矩阵·逆向·ctf
DevOpenClub1 天前
网站标题与图标 API:URL 输入、空字段与返回边界
api·favicon·网站工具
艺杯羹2 天前
Windows原生软件锁设计:从暴力杀进程丢数据到零轮询事件驱动架构
windows·系统架构·开源·开源软件·内存管理·开源协议
菩提小狗2 天前
每日安全情报报告 · 2026-11-07
网络安全·漏洞·cve·安全情报·每日安全
不庸.2 天前
theHarvester 入门教程:从装好到看懂输出
安全·web安全·网络安全·开源·安全性测试
csdn_aspnet2 天前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac