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