Win32 API实战源码解析:消息循环、GDI绘图与DLL调用
简介《精通Windows API-函数、接口、编程实例(源码)》是一份面向中高级C开发者的Windows编程实战资料围绕Win32 API调用与COM接口应用展开适合需要系统掌握桌面应用开发、系统级程序设计与调试能力的程序员。书中156个实例覆盖窗口管理、消息循环、动态链接库加载、文件操作、多线程与进程通信等核心领域并对CreateWindowEx、SendMessage、GetMessage、LoadLibrary、GetProcAddress等常用API及IUnknown等COM接口的引用计数和查询机制进行源码级剖析。压缩包内含1789个文件以c/cpp源文件、vcproj工程文件、exe可执行程序、htm说明文档、pdb调试符号、obj中间文件等为主类型完整覆盖编译、运行、文档浏览和调试检索需求整体约24.29MB。已有368人学习读者可借助完整实例源码、工程文件及可执行程序直接编译运行边做边学边调试边理解有效提升Windows平台下的编程与排错能力。配套源文件可在Visual Studio中直接打开工程逐行跟踪API调用流程快速吸收书中156个实例的设计思路。1. 为什么今天还要碰 Win32这套 C 源码包的真正价值很多新手拿到 Windows API 的学习资料第一反应是“我都写 Qt 了还用得着 Win32 吗”——但 Windows 这个平台所有框架的底层归宿都是 User32.dll、Kernel32.dll、GDI32.dll 这一组原生接口。某前辈带我排查一个偶发抖动问题调了三天 UI 线程迟迟解决不了最后用 Win32 的 PeekMessage 手动控制消息泵才找到根因。那之后我才明白Win32 API 不是过时的老古董而是调试一切 Windows 应用的底层照妖镜。这份《精通 Windows API-函数、接口、编程实例(源码)》我拆过一遍内容组织方式和其他资料最大的区别在于它不空谈理论每个函数、每个接口都能在源码包里找到可编译的运行实例。适合以下几类人要用纯 C 做原生模块的开发者需要深入调 UI 疑难杂症的从业者以及想弄懂消息驱动机制的初学者。2. 三大件窗口类、消息循环与句柄体系2.1 理解 Win32 的消息驱动模型窗口不做事只回应Windows GUI 程序的运行逻辑和传统控制台程序完全不同。控制台程序是按顺序执行而 Win32 程序是事件驱动的——程序启动后不主动执行任何业务逻辑而是告诉系统“我对什么事件感兴趣”然后进入一个循环等待事件到来。这就是消息循环。这份资源在一开始就用一个最简窗口程序把整个模型串起来了我拆解后的学习顺序是这样的先看 WinMain 入口再看窗口过程函数最后看消息循环内的 DispatchMessage 如何把消息回调到窗口过程。三者缺一不可但初学者的常见错误是先钻进某个函数的细节出不来了。// 最简 Win32 窗口框架摘自资源第一部分的实例代码 #include windows.h LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); // 窗口过程系统每产生一条消息就调用一次返回值标识消息是否已处理 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 第一步注册窗口类 WNDCLASS wc {0}; wc.lpfnWndProc WndProc; // 指定消息处理函数 wc.hInstance hInstance; // 当前模块句柄 wc.lpszClassName DemoWindow; // 窗口类名全程序唯一 RegisterClass(wc); // 第二步创建窗口 HWND hwnd CreateWindow(DemoWindow, Hello, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL); // 第三步显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 第四步消息循环 MSG msg; while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); // 把键盘按键转换成字符消息 WM_CHAR DispatchMessage(msg); // 将消息分派到窗口过程 } return msg.wParam; }这段代码的逻辑并不复杂但参数含义值得逐一把它吃透。WNDCLASS 的 lpfnWndProc 成员决定了这个窗口类所有窗口的事件走向hInstance 则关联了当前 exe 模块。CreateWindow 返回的 HWND 是核心句柄后面所有针对这个窗口的操作——移动、销毁、改变文本——都要拿着它去调用 API。消息循环中 GetMessage 在收到 WM_QUIT 时返回 0循环退出TranslateMessage 和 DispatchMessage 看起来平淡无奇其实前者负责把 WM_KEYDOWN 转成携带字符编码的 WM_CHAR后者才真正触发窗口过程。这套源码包把每个参数旁都做了注释比我见过的大多数教材细致得多。2.2 从实例源码反推函数签名看懂返回值与参数命名规律Win32 API 函数数量庞大新手最头疼的是记不住签名。这份资源处理这个痛点的办法非常实用它把同一函数的实例源码集中编排让学习者从“调用方式”反推“函数意图”。例如 SetWindowLongPtr 这个函数看名字就知道是“设置窗口的长指针属性”但参数为何是 GWLP_WNDPROC 这类常量单看文档很难有体感。源码包里的子类化实例直接演示了通过这个函数替换窗口过程的过程。// 窗口子类化实例节选替换窗口过程监听滚动条消息 LONG_PTR WINAPI SubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); LONG_PTR g_oldProc 0; // 保存原始窗口过程地址 // 在初始化时挂接子类化 void SetupSubclass(HWND hwnd) { // GWLP_WNDPROC 是窗口实例内存中的窗口过程指针偏移量 g_oldProc GetWindowLongPtr(hwnd, GWLP_WNDPROC); SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)SubclassProc); // 程序退出时必须还原否则窗口销毁时访问已卸载的代码地址 } LONG_PTR CALLBACK SubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg WM_VSCROLL) { // 在这里处理滚动条事件做自定义业务逻辑 } // 未处理的消息交还原窗口过程保持默认行为 return CallWindowProc((WNDPROC)g_oldProc, hwnd, msg, wParam, lParam); }SetWindowLongPtr 的第一个参数是窗口句柄第二个参数是索引值第三个数是要写入的新值。源码中 g_oldProc 必须保存原始过程的指针因为子类化本质上是拦截——你不保存旧地址消息链条就断了。实例代码中 for 循环测试了 100 次消息响应用来确认子类化不会因递归调用而炸掉。Win32 学习中的“接口感”就是从这类源码的反复阅读中养成的知道哪些参数是句柄、哪些是常量索引、哪些是回调指针再去看文档就快多了。这套源码包的价值不在于代码多高级而在于把函数、接口和完整调用场景绑在了一个个可编译的工程里。3. 拆解源码包的编排逻辑按消息类型学而不是按函数名学3.1 控件编程实例按钮、编辑框、列表控件的消息反射处理很多 Win32 初学者拿着源码包第一反应是找个地方打开就跑。我拿到这份资源后的第一件事是看目录结构发现它的章节组织是按消息类型与交互场景编排的不是按 API 函数名字典式排布。这种组织方式对学习极其有利每个场景对应一组完整的“消息产生—消息分发—消息处理—界面更新”链条。比如编辑框控件章节它就同时覆盖了 WM_COMMAND 通知码、EM_GETTEXT 消息、字符串转换等多层知识点。// 编辑框内容获取与校验实例仅列出核心消息处理片段 case WM_COMMAND: if (LOWORD(wParam) IDC_EDIT_INPUT HIWORD(wParam) EN_CHANGE) { // EN_CHANGE 是编辑框内容变化的通知码 // LOWORD 是控件 IDHIWORD 是通知码完整对应 WM_COMMAND 的参数布局 char buffer[256]; GetDlgItemText(hwnd, IDC_EDIT_INPUT, buffer, 256); // GetDlgItemText 内部等同于 SendMessage(hwnd, WM_GETTEXT,...) if (strlen(buffer) 12) { SetWindowText(hwnd, 输入长度超限); } } break;此处 WM_COMMAND 的消息解析是 Win32 控件的核心套路LOWORD 取控件标识符HIWORD 取通知码二者缺一不可。资源的控件章节足足给了 5 个完整的交互实例覆盖按钮、编辑框、下拉框、列表视图、滚动条每个实例都遵守“控件创建—事件响应—数据获取”三步结构。对照源码阅读时注意一点控件的行为完全由父窗口的 WM_COMMAND 或 WM_NOTIFY 驱动初学者容易搞混消息到底发给谁。实例代码通过 Parent窗口处理控件消息的方式做了清晰的示范。3.2 GDI 绘图与设备上下文DC 的获取与释放平衡GDI 部分是这个源码包的重头戏。设备上下文是 Win32 绘图的基石但它的获取/释放配对原则容易被漏掉。BeginPaint 必须配 EndPaintGetDC 必须配 ReleaseDC这是两个严格的配对关系资源源码里每处都做了对称标注。来看文本输出实例的逻辑// GDI 文本输出完整流程含双缓冲防闪烁处理 case WM_PAINT: { PAINTSTRUCT ps; HDC hdc BeginPaint(hwnd, ps); // BeginPaint 会通过窗口类背景画刷自动擦除背景 // 若在这里执行耗时绘图会出现明显的白闪 HDC memDC CreateCompatibleDC(hdc); // 创建内存兼容 DC HBITMAP bmp CreateCompatibleBitmap(hdc, 800, 600); HGDIOBJ oldBmp SelectObject(memDC, bmp); // 把位图选入内存 DC // 在内存 DC 上完成所有绘制 RECT rect {20, 20, 400, 100}; DrawText(memDC, Hello GDI, -1, rect, DT_CENTER | DT_VCENTER); // 一次性把内存 DC 内容复制到窗口 DC避免中间闪烁 BitBlt(hdc, 0, 0, 800, 600, memDC, 0, 0, SRCCOPY); SelectObject(memDC, oldBmp); // 恢复旧对象后再释放 DeleteObject(bmp); // 删除位图对象 DeleteDC(memDC); // 释放内存 DC EndPaint(hwnd, ps); // 与 BeginPaint 严格配对 break; }注意双缓冲的流程顺序开发者容易在 SelectObject 恢复对象上翻车。若在 DeleteDC 之前忘了 SelectObject 还原旧位图内存 DC 还持有已删除对象的引用后续操作可能异常。多数 GDI 崩溃都出现在对象选择顺序错乱上。这套源码包的 GDI 章节里所有绘制实例都带着清理代码这点做得相当扎实。3.3 动态链接库与资源管理DLL 导出函数的显式调用DLL 部分是这个资源区别于基础教程的另一亮点。它不只是讲 LoadLibrary 和 GetProcAddress 的用法而是提供了完整的 DLL 工程调用工程配对源码。显式链接和隐式链接的区别在代码中一目了然// 显式链接 DLL 并调用导出函数完整流程 typedef int (*ADD_FUNC)(int, int); // 函数指针类型定义必须与 DLL 导出签名一致 HMODULE hDll LoadLibrary(mathLib.dll); if (hDll ! NULL) { ADD_FUNC addFunc (ADD_FUNC)GetProcAddress(hDll, Add); // Add 函数名必须与 .def 文件或 __declspec(dllexport) 声明的完全一致 // 大小写不能错否则返回 NULL if (addFunc ! NULL) { int result addFunc(3, 4); // 通过指针间接调用无编译期链接 } FreeLibrary(hDll); // 加载计数减一引用归零时卸载 }GetProcAddress 返回的是 FARPROC 类型的裸函数指针必须强转成具体的调用签名这个转换是风险集中区。如果 DLL 内部函数实际使用 __stdcall 约定而你声明成 __cdecl运行时必然崩溃。资源的 DLL 工程里在头文件处用宏做了统一的调用约定声明避免了这个问题。源码中包含的完整调用链对理解 Windows 的模块加载机制很有帮助。4. 踩坑与排查Win32 源码复现中的六个高频翻车点4.1 Unicode 与 ANSI 字符串混用导致乱码现象窗口标题显示成乱码或 GetWindowText 取回来的中文内容输出异常。原因Windows 2000 以后系统底层全部走 UTF-16CreateWindow 在编译时被宏映射到 CreateWindowW而字符串常量若没加 L 前缀就是 ANSI 编码。源码包里多个实例工程没有统一字符集设置混用 TCHAR、char、wchar_t 时出了问题。解决项目属性 → 字符集改为“使用 Unicode 字符集”代码中统一用 _T() 宏包裹字符串字面量。这套源码的工程文件有的默认是 ANSI需要手动切换。4.2 WM_PAINT 里的 BeginPaint 漏调用现象窗口区域拖动后出现残影或重绘区域变黑。原因BeginPaint 除了返回 DC还会验证无效区域告诉系统“这块我已经重新画过了”。漏掉它系统会认为重绘还没完成反复发送 WM_PAINT。部分初改源码的开发者用 GetDC 代替 BeginPaint但 GetDC 不会清除无效区域。解决只要响应 WM_PAINT一律使用 BeginPaint/EndPaint 配对不要混用 GetDC。4.3 CreateWindow 失败返回 NULL 但 GetLastError 无效现象CreateWindow 返回 NULL但 GetLastError 给出的错误码指向不明。原因CreateWindow 会向窗口过程发送 WM_CREATE 消息。如果 WM_CREATE 的处理函数返回 -1CreateWindow 就失败此时 GetLastError 的值意义不大真正的原因要在 WM_CREATE 分支里查。解决在窗口过程的 WM_CREATE 分支里逐行输出调试信息常见原因是创建子控件时的父窗口句柄传错。4.4 子窗口 SetFocus 导致焦点闪烁现象多窗口切换时控件焦点不稳定界面不断闪烁。原因在 WM_KILLFOCUS 或 WM_SETFOCUS 里直接调用 SetFocus 设置另一个控件造成焦点互踢。解决焦点切换放到消息循环之后的空闲时间处理或者用 PostMessage 发自定义消息延迟处理。4.5 收到 WM_SIZE 后立刻重绘引发的死循环现象程序卡死或窗口尺寸连续变化时 CPU 占满。原因在 WM_SIZE 分支中调用了 SetWindowPos 或 MoveWindow又触发了新的 WM_SIZE。解决加一个 bool 标志位防止重入或在 WM_SIZE 里只更新布局变量在 WM_PAINT 中统一绘制。4.6 释放 DLL 时崩溃模块句柄顺序错误现象FreeLibrary 之后程序随机崩溃尤其是在 DLL 内部创建过线程或钩子的场景。原因DLL 被卸载时内部线程还没有完全退出代码段已经不存在线程一旦恢复执行就访问非法地址。解决在 DLL_PROCESS_DETACH 里先通知线程退出等待线程完全结束后再返回 FALSE 或允许卸载。5. 从实例到工程消息日志与自绘控件的进阶验证法源码包中的实例是静态的但实践场景是动态的。我这里推荐一个可复现率极高的验证方法给资源中任意一个窗口程序加一个消息日志窗格把每个收到的消息的 msg 值和 wParam、lParam 格式化成字符串追加显示。这个技巧能帮你快速确认所有控件的消息走向验证自己对 WM_COMMAND、WM_NOTIFY 以及自定义消息的理解是否准确。// 消息日志打印函数可直接插入任意窗口过程顶部 void LogMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // 1. 过滤高频噪声消息WM_MOUSEMOVE、WM_NCHITTEST 等 if (msg WM_MOUSEMOVE || msg WM_NCHITTEST || msg WM_PAINT) return; // 2. 格式化输出便于排查控件通知码 wchar_t buffer[512]; wsprintfW(buffer, L[0x%04X] wParam0x%08X lParam0x%08X\n, msg, wParam, lParam); // 3. 打开文件追加写入避免阻塞 UI 线程本例简写 OutputDebugStringW(buffer); }把这个日志函数挂到资源实例的 WndProc 最前端你就能看到最真实的 Windows 消息运行轨迹。把 WM_COMMAND 的 wParam 拆成高低字再用 GetDlgItem 验证控件句柄你会发现通知码的真实分布和教材描述完全一致。这个习惯保留下来排查任何 Windows 界面疑难杂症都比直接看文档更直观。另一个值得动手的验证是自绘按钮。资源里关于 owner-draw 按钮的实例代码实现了对 WM_DRAWITEM 的完整处理这是把静态知识点转化成工程能力的好题目。我一般会建议在此基础上叠加一个透明背景效果体验 GDI 对象选择与擦除的完整链条。翻过车才记得住那次我在某图像处理 Demo 里把 SetBkMode 设置成 OPAQUE导致按钮文字的底色无法跟随界面上方区域变化调试了两天才发现是绘制顺序的问题。从那以后我每次拿到别人的 Win32 源码都强制走一遍“先加消息日志、再动绘制代码、最后改资源脚本”的顺序。希望这份拆解能帮你把 Windows API 的源码包真正用起来少走一些我走过的弯路。本文还有配套的精品资源点击获取

相关新闻

Grid Beam Search:打破长度偏差的序列生成解码算法

Grid Beam Search:打破长度偏差的序列生成解码算法

如果你经常跟 seq2seq 模型打交道,一定经历过这种纠结:beam size 设成 5 还是 10?length penalty 的系数 α 到底是 0.6 还是 1.2?为什么 beam search 出来的结果老是往短句偏?这些看起来是调参问题,背后其…

2026/10/15 14:34:43 阅读更多 →
指纹浏览器环境仿真技术与AI风控对抗实战

指纹浏览器环境仿真技术与AI风控对抗实战

1. 项目背景与行业现状指纹浏览器环境仿真技术正在成为数字身份管理领域的重要基础设施。根据最新行业调研数据显示,到2026年全球反欺诈解决方案市场规模预计将达到900亿美元,其中基于浏览器指纹的风控系统占比超过35%。这种技术通过收集用户设备的硬件配…

2026/10/15 14:33:42 阅读更多 →
SQL按月统计数量:跨数据库实现与缺失月份补零方案

SQL按月统计数量:跨数据库实现与缺失月份补零方案

1. 为什么“按月统计数量”是个高频又容易踩坑的需求做数据统计的人,几乎都绕不开一个经典场景:给一个起始时间和一个结束时间,要求把这段时间内每个月的业务数量统计出来。比如订单系统要出月度报表、内容平台要统计每月新增用户、仓储系统要…

2026/10/15 14:33:42 阅读更多 →

最新新闻

OpenTelemetry Instrumentation for VoyageAI:为 Embedding 与 Rerank 调用接入可观测性

OpenTelemetry Instrumentation for VoyageAI:为 Embedding 与 Rerank 调用接入可观测性

LLMOps可观测性 【免费下载链接】openllmetry Open-source observability for your GenAI or LLM application, based on OpenTelemetry 项目地址: https://gitcode.com/gh_mirrors/op/openllmetry 点击查看 免费下载 这篇技术指南以 openllmetry 仓库中的 opentel…

2026/10/15 15:19:02 阅读更多 →
高校实训Day1:从环境初始化到最小可行闭环的工程启蒙

高校实训Day1:从环境初始化到最小可行闭环的工程启蒙

1. 项目概述:一场面向真实工程场景的入门实战“山东大学实训 Day1”这个标题看似简单,但背后承载的是高校工科教育中最具实操张力的一环——从理论课堂到工程现场的首次跨步。我带过不下二十期校企联合实训项目,几乎每届学生在第一天都会经历…

2026/10/15 15:19:02 阅读更多 →
Java养老院管理系统开发实践与技术解析

Java养老院管理系统开发实践与技术解析

1. 项目概述:养老院管理系统的核心价值养老院管理系统是针对养老机构日常运营需求开发的专业化信息管理平台。这个基于Java技术栈的系统整合了养老院从入住管理到日常护理的全流程业务,解决了传统纸质记录效率低下、信息孤岛严重、数据统计分析困难等行业…

2026/10/15 15:19:02 阅读更多 →
MCP协议安全解析:AI模块化连接的风险与防御

MCP协议安全解析:AI模块化连接的风险与防御

1. 项目概述:当AI生态遇上"万能接口"隐患去年参与某金融AI系统对接时,我第一次见识到MCP协议的威力——只需简单配置,三个不同厂商的AI模块就像乐高积木一样咔嗒对接成功。但庆祝酒会还没结束,安全团队就发来了警报&…

2026/10/15 15:19:02 阅读更多 →
VC++与OpenGL加载3ds模型:从chunk解析到场景漫游全攻略

VC++与OpenGL加载3ds模型:从chunk解析到场景漫游全攻略

简介:VC结合OpenGL与lib3ds库实现3ds模型导入、渲染及交互式漫游的完整工程源码,面向具备C基础、希望深入图形编程与三维模型处理的开发者。工程共102个文件,压缩包1.73MB,涵盖24个C/C头文件、20个C源文件、18个C源文件&#xff0…

2026/10/15 15:19:02 阅读更多 →
非负矩阵分解NMF详解:MATLAB手写代码与调参实践

非负矩阵分解NMF详解:MATLAB手写代码与调参实践

简介:这份非负矩阵分解MATLAB代码包较为完整地涵盖了基础NMF及常见扩展与优化实现,适合机器学习、图像处理、文本挖掘和生物信息学方向的研究者、学生及工程人员使用。包内围绕VWH的分解目标,提供了乘法更新、交替最小二乘等主流优化算法实现…

2026/10/15 15:18:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →