You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ WinAPI中WPARAM与LPARAM是什么?为何要使用?

为什么Windows窗口程序要使用WPARAM和LPARAM
  • 说白了就是通用参数容器:Windows的消息机制是一套统一框架,不同消息要传递的参数类型天差地别——鼠标消息要传坐标,键盘消息要传按键码,菜单消息要传菜单ID。WPARAM和LPARAM就是为了兼容所有这些参数设计的通用载体,底层是和系统位数匹配的整数类型(WPARAM通常是UINT_PTR,LPARAM是LONG_PTR),能存储指针、整数、句柄等各种数据。

  • 历史兼容的产物:早年16位Windows里,WPARAM是16位的“字”,LPARAM是32位的“长字”,分别用来传递小数据和大数据/指针。后来升级到32位、64位系统,这两个类型被扩展成对应位数的整数,但名字保留了下来,目的是让旧代码不用大规模修改就能在新系统上运行。

  • 实现消息处理的统一接口:窗口过程函数(WndProc)的签名是固定的:

    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    

    正是有了WPARAM和LPARAM,所有类型的消息都能通过这同一个接口传递参数,不用为每个消息单独定义不同的函数签名,大大简化了整个消息机制的设计。

  • 按需解析参数:不同消息下,你可以把WPARAM和LPARAM解析成对应的数据类型。举几个常见例子:

    • 处理WM_KEYDOWN时,wParam是按键的虚拟键码(比如VK_RETURN),lParam里包含按键重复次数、扫描码等细节;
    • 处理WM_MOUSEMOVE时,lParam的低16位是x坐标,高16位是y坐标,用LOWORD(lParam)和HIWORD(lParam)就能提取;
    • 处理WM_COMMAND时,wParam低16位是控件ID,高16位是通知码,lParam是对应控件的句柄。

内容的提问来源于stack exchange,提问作者user19164169

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:31:07