这些天刚开始学习win32 API,出于对未知的不安,我试图用打印出所有爬过系统的消息的详细资料。其中有个简单的需求:从消息值反推出名称串,类似:
在MSDN上搜了下,貌似没有API;也没怎么找到网上的资源,只好自己动手了。
我们现在就要获得一个完整的、C++程序能识别的消息值-消息名的表。Win32的大部分消息在 WinUser.h 中定义的,形如:
考虑到消息种类非常多,手工完成这个表很累也很容易出错。这里我想起一种有趣的技术:我们可以用C++写一个自动程序,扫描 WinUser.h 文件,自动完成所需的C++代码。碰巧逻辑也不难。以最重要的 WM_前缀消息为例,只要将所有以 "#define WM_” 开头的行提取出来,分别读出字符串 "WM_ PAINT" 以及剩下的串"0x000F",就可以转化为类似下的 C/C++ 代码:
这样算还相当稳健,规避了棘手的表达式解析。鉴于后面将提到的条件编译问题,保留表达式反倒比解出来更准确。
这里共享一个简化的版本,包括 VS2008 的 WinUser.h 中所有 WM_ 前缀的消息(该文件可以编译通过):

本文介绍了如何使用C++自动生成代码,从Win32 API的WinUser.h文件中提取并转换消息值到消息名称。通过扫描头文件,创建映射表,实现WM_前缀消息的转换。文章讨论了处理值域冲突、条件编译、以及在解析过程中遇到的挑战和解决方案,同时提到了其他类型的消息和跨进程通信的注册消息。
最低0.47元/天 解锁文章
22万+

被折叠的 条评论
为什么被折叠?



