# 代码阅读顺序 这份顺序不是按“文件名排序”,而是按“学生最容易建立整体理解”的顺序排的。 ## 第一轮:先看最上层界面怎么把链路串起来 1. [main.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/main.cpp) 先看程序从哪里启动,主题在哪里设置,主窗口是哪个类。 2. [APP/APP_UIWindow.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_UIWindow.h) 先看主窗口成员和函数声明,建立“APP 层到底做什么”的总印象。 3. [APP/APP_UIWindow.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_UIWindow.cpp) 重点看这几个函数: - `App_Func_InitWindow()` - `App_Func_InitUi()` - `App_Func_InitConnect()` - `App_Func_InitLogic()` - `App_Func_OnPollTimer()` - `App_Func_RefreshDebugView()` 这一轮的目标是先搞清楚: - 主窗口什么时候创建 - 调试窗口什么时候插入 - 定时轮询什么时候启动 - UI 是怎么调用 LGC 的 ## 第二轮:看调试开关和调试界面 4. [DEBUG/Debug_Config.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DEBUG/Debug_Config.h) 看总开关宏 `APP_ENABLE_DEBUG_WINDOW`。 5. [DEBUG/Debug_Panel.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DEBUG/Debug_Panel.h) 6. [DEBUG/Debug_Panel.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DEBUG/Debug_Panel.cpp) 看调试窗口只负责“显示”,不负责“解析”。 这一轮的目标是搞清楚: - 为什么调试功能可以整体开关 - 为什么 UI 层只显示文本,不做协议解析 ## 第三轮:看 APP 层自己的纯界面数据 7. [APP/APP_KeypadModel.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_KeypadModel.h) 8. [APP/APP_KeypadModel.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_KeypadModel.cpp) 这是界面按键布局数据,不是 HID 协议。 9. [APP/APP_Theme.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_Theme.h) 10. [APP/APP_Theme.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_Theme.cpp) 这是界面主题,不是协议,也不是设备层。 这一轮的目标是明确: - APP 层有哪些东西只是“画界面” - 哪些东西绝对不能混进 DRI / LGC ## 第四轮:看 MID 层,建立协议常量和公共结构认知 11. [MID/Mid_Def.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/MID/Mid_Def.h) 12. [MID/Mid_Def.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/MID/Mid_Def.cpp) 这一轮一定要记住: - 当前有 3 个主链 report:`0x01 / 0x03 / 0x04` - `0x04` 是 `FF00 / 0002` - `0x04` 固定结构是 `[report_id | modifier | usage_bitmap(29)]` - MID 只放“大家共用的固定定义”,不放设备打开逻辑,也不放协议语义判断 ## 第五轮:看 LGC 总控,理解“谁调用谁” 13. [LOGIC/Lgc_Core.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Core.h) 14. [LOGIC/Lgc_Core.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Core.cpp) 重点看: - `Lgc_Core_Func_Start()` - `Lgc_Core_Func_RefreshDevice()` - `Lgc_Core_Func_Poll()` 这一轮要看懂: - LGC 怎么分别驱动 `Dri_NkroRaw / Dri_Consumer / Dri_Vendor` - 收到原始包以后,怎么分流给不同解析函数 - 最后为什么 UI 只拿到整理好的文本 ## 第六轮:看三个 report 的协议解析 15. [LOGIC/Lgc_Vendor.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Vendor.h) 16. [LOGIC/Lgc_Vendor.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Vendor.cpp) 这一组最重要,先精读。 17. [LOGIC/Lgc_Nkro.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Nkro.h) 18. [LOGIC/Lgc_Nkro.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Nkro.cpp) 19. [LOGIC/Lgc_Consumer.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Consumer.h) 20. [LOGIC/Lgc_Consumer.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Consumer.cpp) 这一轮的目标: - 彻底看懂 `0x04` 的完整解析流程 - 再回头看 `0x01` 和 `0x03` ## 第七轮:最后看 DRI,理解“原始包从哪来” 21. [DRI/Dri_Vendor.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Vendor.h) 22. [DRI/Dri_Vendor.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Vendor.cpp) 先看 vendor,因为当前调试最关键。 23. [DRI/Dri_NkroRaw.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_NkroRaw.h) 24. [DRI/Dri_NkroRaw.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_NkroRaw.cpp) 25. [DRI/Dri_Consumer.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Consumer.h) 26. [DRI/Dri_Consumer.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Consumer.cpp) 这一轮要明确: - DRI 只负责枚举、打开、读写 - DRI 不判断业务语义 - DRI 不解释 `report id 0x04` 代表什么 ## 一个最推荐的实际阅读路径 如果你这次只想先吃透“调试抓包 + 0x04 解析”这一条线,最推荐按下面顺序读: 1. `main.cpp` 2. `APP/APP_UIWindow.h` 3. `APP/APP_UIWindow.cpp` 4. `DEBUG/Debug_Config.h` 5. `DEBUG/Debug_Panel.h` 6. `DEBUG/Debug_Panel.cpp` 7. `LOGIC/Lgc_Core.h` 8. `LOGIC/Lgc_Core.cpp` 9. `LOGIC/Lgc_Vendor.h` 10. `LOGIC/Lgc_Vendor.cpp` 11. `MID/Mid_Def.h` 12. `MID/Mid_Def.cpp` 13. `DRI/Dri_Vendor.h` 14. `DRI/Dri_Vendor.cpp` 这个顺序最符合教学。 原因很简单: - 先知道“程序怎么串起来” - 再知道“调试窗口怎么显示” - 再知道“逻辑层怎么分流” - 再知道“0x04 怎么解析” - 最后才看“Windows HID 怎么打开”