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
相关产品推荐
相关产品推荐

