VCLSkin 4.98源码版:Delphi老项目换肤编译避坑实战
简介VCLSkin 4.98 源码版是一套面向 Delphi 与 CBuilder 开发者的界面美化库通过皮肤引擎可快速替换窗口、按钮、菜单等控件外观提升应用视觉体验。压缩包共含 62 个文件大小约 971KB其中 .skn 是皮肤样式文件.pas/.cpp 为组件源码.dpk/.bpk/.cbproj 是各版本 IDE 的工程文件另有 .chm 帮助文档和 readme.txt 说明文件结构划分清晰。目前已有 154 人学习下载。这份源码版的价值在于完全开放底层实现开发者既能直接套用预设皮肤实现换肤也能深入研读 VCLSkin 的加载与绘制机制按需扩展功能、修复兼容性问题甚至将其移植到自有框架中同时“Skins”目录内置 Office2007、VistaXP、macOS 等多套皮肤配合 help 手册与示例代码可明显降低二次开发门槛。1. VCLSkin 4.98 源码版老 Delphi 工程换肤为什么源码包比安装包更值得投入如果你手头有一个还在用 Delphi 7 或 XE 系列维护的老项目甲方突然要换皮肤大概率会被推荐 VCLSkin 4.98 源码版。这是一个针对 VCL 框架的皮肤控件库4.98 是它的经典版本号源码版意味着你能拿到全部 .pas 源文件而不是只拿到安装包里的编译后 BPL/DCU。对我来说源码版最大的价值不是“看得见源码”而是当第三方控件和皮肤框架抢消息循环时你终于能从调用栈里找到是哪一层把自己的窗口子类化搞崩了。这篇文章不聊商业授权只讲落地源码怎么编译、工程怎么接、参数怎么调、哪些坑我踩过之后不想你再踩。2. 源码包工程结构先分清三类文件再考虑编译2.1 解开压缩包后先做三件事区分 PAS、DCU、BPL 与皮肤文件VCLSkin 4.98 源码版拿到手以后目录里一般混着 .pas 源文件、编译好的 .dcu、还有运行时包需要的 .bpl。我先提醒一句千万别图省事直接把这个目录扔进全局 Library Path。常见做法是先建一个干净的目录把源文件按“核心运行库”“设计期包”“皮肤文件样例”三个子目录分开。核心运行库是 skincnlt.pas、skindata.pas、skinmanager.pas 这些运行时才碰的单元设计期包则是注册 TskSkinManager、TskSkinStore 到 IDE 工具箱的代码通常单独编成一个 design-time 包。我一般会先检查有没有 .bpl 文件。如果压缩包带的是已经编译好的运行时包那源码版的意义就少了一半。你要做的不是直接用 DCU而是把对应版本号的 .pas 全部拉进一个包项目里重新编译。这一步是为了保证 DCU 和你本地 IDE 的 RTL 版本完全一致。千万别混合使用比如 Delphi 7 的 DCU 拿到 Delphi XE 下编出来的 BPL 用基本开场就报“unit 版本不匹配”或者直接 Access Violation。2.2 配置 Library Path 与 Search Path让 IDE 找到 skincnlt 这个关键单元把源码目录整理好之后下一步是把“核心运行库”目录加进 IDE 的 Library Path。这里有个细节如果只是临时拖进当前工程的 Search Path那么换一台电脑或者重开工程就会找不到单元编译报错“Cannot find unit skincnlt”。我建议直接加进全局 Library Path但只加“核心运行库”那个子目录不要把设计期包目录也塞进去否则 IDE 一启动就可能加载重复包。如果你用的是 Delphi 7操作路径是 Project - Options - Directories/ConditionalsXE 以上版本在 Tools - Options - Delphi Options - Library Path。加到全局路径后重启 IDE 一次目的是让 IDE 重新扫描可用包。然后打开 Component - Install Packages把编译好的设计期包加进去。这里有个判断点如果你能在组件面板看到 TskSkinManager 和 TskSkinStore说明设计期注册成功如果看不到但编译能过也可以用代码动态创建组件只是后续调整皮肤属性会麻烦不少。2.3 版本差异Delphi 7 到 XE 系列的编译开关差在哪VCLSkin 4.98 的源码版能覆盖从 Delphi 7 到 RAD Studio XE 的很多版本但源码里有一段按编译器版本条件编译的逻辑。我见过最典型的坑在 Delphi 2009 以后使用源码里有个SKIN_Unicode的编译指令如果没有打开皮肤文件里的中文标题会显示成乱码。源码包通常会在 skincnlt.pas 头部注释里写明这个指令但很多人不会主动去改。常见做法是打开项目源文件在{$DEFINE}区加一句{$DEFINE SKIN_Unicode}并且确认目标是 32 位。VCLSkin 4.98 这个时代的设计目标基本是 32 位网上流传的 dcu 也大多是 32 位如果你非要用 64 位编译需要自己重新把所有 .pas 编译成 64 位版本。不是不能做而是坑不少后面避坑章我会单独讲。编译开关这件事别信“默认就是对的”源码版的价值就在于你可以看条件编译段逐个确认当前 IDE 版本命中哪些分支。3. 把 VCLSkin 4.98 接进一个最小工程从空窗体到换肤成功3.1 用 Build 而非 Compile 跑通全链避免旧 DCU 残留现在开始动手。新建一个 VCL Forms 工程放一个按钮、一个编辑框再放一个 TskSkinManager。如果你打算手工写代码也可以不放组件直接声明变量。但我更推荐先用组件拖一遍因为 TskSkinManager 的属性比较多设计期能看到下拉列表。在点击 Run 之前先用 Project - Build 而不是 Compile。区别在于Build 会检查所有单元的时间戳把过期的 DCU 全部重新编译。源码版最容易出现的情况是把 .pas 文件替换成了新版本但 DCU 还停留在旧版本Compile 可能不触发重编最后运行起来皮肤行为还是旧的。我习惯在做完包安装后先 Build 一次所有项目把当前目录下的 DCU 统一刷一遍。如果项目提示找不到某个源文件优先检查 Library Path 顺序而不是急着把文件复制进工程目录。3.2 放置 TskSkinManager 并配置 ActiveSkin最小可运行代码最简接入方式是把 TskSkinManager 放到主窗体上设置两个属性SkinStore指向一个 TskSkinStore 组件SkinName选择一套皮肤名。TskSkinStore 里要“加载”皮肤文件双击它可以进入皮肤文件列表管理。一个常见误区是以为把皮肤文件放到程序同级目录就能被自动读取其实皮肤文件必须通过 SkinStore 在运行前或运行时加载。下面是一段在FormCreate里动态加载的代码适合不使用设计期组件、纯代码创建控件的场景uses skincnlt, skindata, skinmanager; procedure TForm1.FormCreate(Sender: TObject); var SkinMgr: TskSkinManager; SkinSt: TskSkinStore; begin SkinSt : TskSkinStore.Create(Self); SkinSt.Name : MySkinStore; // 从外部文件加载皮肤集合第一个参数是文件完整路径 SkinSt.SkinFile.LoadFromFile(Office2007.skn); SkinMgr : TskSkinManager.Create(Self); SkinMgr.Name : MySkinMgr; // 指定皮肤数据源哪个 Store以及 Store 里第几套皮肤 SkinMgr.Store : SkinSt; SkinMgr.ActiveSkin : Office2007; end;这段代码的逻辑是先创建皮肤仓库把 .skn 文件读进内存再创建皮肤管理器把仓库和具体皮肤名绑定。LoadFromFile是同步读取如果文件很大或网络盘路径较慢会有明显的启动卡顿所以实际项目里更推荐把它放进资源文件后面第 6 章会讲。必须注意组件创建顺序先创建 Store再创建 Manager否则Manager.Store : SkinSt时仓库还没初始化ActiveSkin 会失效。3.3 两种动态加载姿势LoadFromFile 与 SkinStream 各适合什么场景第一种方式SkinSt.SkinFile.LoadFromFile(..\skins\Office2007.skn)适合开发期快速调试。第二种方式是先把皮肤 .skn 文件作为资源编译进 EXE运行时通过 TResourceStream 加载到 SkinFile。这里先不展开资源文件作法但代码骨架长这样var ResStream: TResourceStream; begin ResStream : TResourceStream.Create(HInstance, Office2007, RT_RCDATA); try SkinSt.SkinFile.LoadFromStream(ResStream); finally ResStream.Free; end; end;第二种姿势的优点是发布时少带一个皮肤文件也不怕用户路径乱改找不到皮肤。缺点是每次改皮肤内容都要重新编译资源不能像外部文件那样热替换。我的习惯是开发期用外部文件发布期切到资源流。切换时只需要改FormCreate里的加载来源其他逻辑不变。这个设计让 VCLSkin 4.98 源码版的接入变得很干净你不需要动业务代码。4. 核心参数与内部机制你真正要调的只有这几个4.1 参数表SkinName、ActiveSkin、ColorDialog 和控件覆盖范围源码版的组件属性非常多但实际高频修改的参数不多。我整理了一张表按影响范围从大到小排列参数/属性影响范围我一般这样设SkinManager.ActiveSkin全局皮肤 ID只在程序启动时设置一次运行时切换会触发全窗体重建不建议频繁调用SkinName当前皮肤显示名跟 Store 里的皮肤列表一一对应写错会变成默认 Windows 风格SkinManager.SkinStore皮肤数据来源指向设计期或代码创建的 TskSkinStoreSkinManager.Options是否启用透明、圆角低配机器慎开透明GDI 刷屏严重TForm.SkinData单窗体覆盖置空则跟随全局单独设置会打断全局统一风格TButton.SkinData控件级覆盖默认由窗体级控制手动设置后不要再改Color否则二者冲突ActiveSkin这个属性名最容易和后端“用户激活”混淆其实它就是一个字符串标记对应 Store 里的皮肤索引。皮肤切换的本质是管理器遍历当前消息循环重建所有顶层窗体的WindowProc再按新皮肤重新绘制非客户区。这也是为什么运行时切换皮肤会伴随瞬时闪烁因为在切换瞬间旧窗口布局已经摧毁新布局尚未完成。4.2 局部换肤窗体和按钮的覆盖逻辑及与全局的优先级VCLSkin 的控件级属性藏在每个组件扩展的SkinData里。主窗体上有一个tskSkinData属性可以单独指定该窗体的皮肤数据按钮、面板、编辑框也有各自的SkinData。我第一次用的时候以为设置了全局 ActiveSkin 就万事大吉结果发现某些第三方控件的子控件没有重新绘制原因就是第三方控件的窗口过程没有进入 VCLSkin 的子类化范围。解决办法是给这些控件手动设置SkinData.SkinSection让它们挂到皮肤文件的某个 section 上。这里的SkinSection是皮肤文件里定义的一组样式名称常见的有“Button”“Edit”“Panel”等。我的习惯是全局设置只负责框架关键业务控件才用SkinData.SkinSection : Button单独强调。这样一来皮肤文件升级时不会影响业务控件的专属样式。需要注意手动设置后该控件的Color、Font.Color可能被皮肤接管你在代码里赋颜色值会看到不生效——这不是 bug是覆盖顺序里皮肤优先级更高。4.3 源码版调试姿势在消息循环里看皮肤句柄释放源码版相比安装版最大的优势不是运行速度而是你可以断点到skincnlt.pas的HookWindowProc里看窗口句柄的保存和释放。我遇到过一个问题关闭子窗体后GDI 句柄数只增不减。用 Task Manager 看 GDI 对象持续增长但代码里明明FreeAndNil了窗体。断点打在skincnlt.pas里才发现旧窗体的皮肤句柄还被保存在一个全局 SkinList 中等待被下一个窗体复用。这个缓存机制是为了性能但短生命周期窗体频繁创建销毁时缓存来不及清理。调试源码版时我会在SkinManager.Notification里加一个条件断点当组件名等于目标窗体名时检查FHandle是否还在全局表里。如果发现旧句柄泄漏需要手动调用SkinManager.RemoveSkinHandle(OldHandle)。这段代码在不同版本里可能写法不同但源码的好处就是可以通过搜索RemoveSkinHandle找到真实入口。如果购买的是安装版这辈子都很难定位到这一步。5. VCLSkin 4.98 源码版编译避坑指南现象、原因与解决5.1 编译报错“Cannot find unit skincnlt”Library Path 顺序问题现象新建工程引用了 VCLSkin编译时提示找不到skincnlt.dcu。原因源文件在磁盘上存在但 IDE 搜索路径没有覆盖到或者被其他同名单元抢先。解决先确认 Library Path 是否指向“核心运行库”子目录再检查 Search Path 里有没有更早的旧版本目录。我遇到过机器上装有另外一套皮肤控件也定义了skincnlt单元IDE 先找到了那家的版本直接编出一堆类型不匹配。解决方法是把 VCLSkin 4.98 源码版的目录放到 Library Path 的最前面并且把其他同名控件的包含目录从工程 Search Path 移除。5.2 窗体切换时风格刷新不及时重绘与 WM_NCPAINT 的关系现象程序启动时皮肤正常打开一个模态对话框再关闭主窗体的标题栏风格被“打回原形”但按钮区域还是新皮肤。原因模态窗体关闭时触发主窗体重新绘制但 WM_NCPAINT 消息被旧窗口过程处理没有走 VCLSkin 子类化逻辑。解决在主窗体WM_NCPAINT消息处理里强制SkinManager.ReloadActiveSkin()或者更优雅地在模态窗体关闭后调用Application.MainForm.Perform(CM_SKINCHANGE, 0, 0)。这个 CM_SKINCHANGE 是源码里自定义的控件消息安装版文档不会写那么细。5.3 高 DPI 下皮肤控件错位缩放参数设错或没设现象在 150% 缩放的 Windows 显示设置下皮肤标题栏比窗体实际高度大一块按钮文字被裁切。原因VCLSkin 4.98 年代默认不感知 DPI系统缩放后皮肤按像素拉伸但控件布局是真实像素两套坐标错位。解决给 EXE 添加 DPI 感知声明在工程 .dpr 里写{$SetPEFlags $0020}然后用SkinManager.Options : SkinManager.Options [soScaleByDPI]让它按当前 DPI 缩放皮肤元素。我在 1080P 屏幕上开发、到 4K 屏演示翻车过一次之后必开这个选项。5.4 64 位目标编译失败源码版里只有 32 位 BPL 的坑现象Project Manager 里切到 Win64 平台编译提示“无法链接 dcu”或者链接时找不到skinmgr.bpi。原因网上的 VCLSkin 4.98 源码包配套 dcu/bpl 绝大多数是 32 位64 位需要你从源码完全重建。解决不要指望直接切平台先把整个包项目以 Win64 为目标重新 Build。我实际操作时遇到的一个额外坑是tskSkinManager里用了Integer保存窗口句柄在 64 位下Handle是 64 位指针截断成 Integer 后可能为 0。源码版需要把这类声明改成NativeUInt再编译。这个改动量不算大但如果不会看源码基本只能放弃 64 位。5.5 与第三方组件冲突窗口子类化链的覆盖顺序现象放了某第三方网格控件后皮肤对弹窗按键失效甚至点击时程序崩溃。原因VCLSkin 和大部分第三方控件通过子类化窗口过程接管绘制后安装的控件会把自己的WindowProc挂到皮肤之上或之下导致消息链断裂。解决在FormCreate最后调用SkinManager.ReloadSkin(True)把全部顶层窗体重新子类化尽量让皮肤过程成为最终兜底。如果还崩溃把你自己的 OnMessage 事件里对WM_NCHITTEST的处理全部注释掉多半就能定位。这条是血泪经验我之前在一个报表系统里排查了两天才发现是某第三方控件的消息钩子先释放了对象。6. 超出默认换肤的进阶用法资源绑定、皮肤流合并与重绘验证6.1 把皮肤文件编译进 EXE 资源发布现场不再问“皮肤文件呢”我强烈建议所有正式项目把 .skn 文件转成 RCDATA 资源。做法是在 .rc 文件里写Office2007 SKIN res\Office2007.skn然后用{$R skin.res}引入。这样发布时只需要一个 EXE 文件运维部署少了一个丢文件的口子。每次更新皮肤你只需要重新编译资源业务代码不用动。我见过因为运维漏拷皮肤文件导致线上软件变成经典 Windows 灰白色外壳被客户截图嘲笑的事。资源流方案从根上解决这个问题。6.2 合并多套皮肤风格SkinStore 里不只放一套TskSkinStore 可以同时容纳多套皮肤文件。设计期打开 SkinStore 编辑器把多个 .skn 依次导入运行期用SkinName切换。有些团队会做“夜间模式”但 VCLSkin 4.98 的皮肤文件是整套绘制资源不是单纯的色板所以做夜间模式需要准备两整套完整皮肤而不是动态改颜色。如果只想局部高亮可以不改 SkinName而是通过SkinData.SkinSection覆盖指定按钮和面板。我还是建议商店做“紧凑”“经典”两套不要试图在源码版之上再造主题引擎维护成本会失控。6.3 性能验证重绘帧率与 GDI 句柄泄漏换肤完成后别急着提交。我会在窗体上放一个 Timer每秒读取GetDC和GetWindowDC的重绘次数重点观察窗口拖动时 CPU 占用是否超过 20%。皮肤框架的常见问题是窗口大小变化时非客户区重绘反复触发 GDI 操作导致低端工控机上拖拽窗口卡成 PPT。验证方法很简单让窗体进入一个循环改变宽度用 Process Explorer 抓 GDI 对象数。如果 GDI 对象数稳定后仍随时间上涨大概率是缓存句柄没释放。源码版的调试断点此刻就是救命的。我在上一次项目里解决了两个泄漏点第一次是模态窗体关闭时没有RemoveSkinHandle第二次是资源流释放后皮肤对象仍引用流内存地址。最后说一个习惯我不会在代码里到处写ActiveSkin : xxx只在主窗体的OnCreate里设置一次之后所有风格变化都走SkinData.SkinSection的局部覆盖。这套思路在 VCLSkin 4.98 源码版上帮我扛过了三个长期维护项目希望你也能顺利避开我踩过的坑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Java+Vue酒店管理系统全栈开发实战

Java+Vue酒店管理系统全栈开发实战

1. 项目概述与核心价值酒店管理系统作为现代服务业数字化转型的典型应用,融合了前后端技术栈与业务逻辑的完整实现。这个基于JavaVueSpringBoot的技术方案,不仅提供了标准化的酒店业务管理功能,更是一套完整的全栈开发教学案例。从技术角度看…

2026/10/15 20:37:13 阅读更多 →
2024年五大技术趋势预测与工程实践指南

2024年五大技术趋势预测与工程实践指南

1. 技术趋势预测的价值与挑战技术趋势预测从来都不是一件容易的事。在这个快速迭代的行业里,我们既要关注当下最热门的技术方向,又要预判未来3-5年可能爆发的领域。作为从业十余年的技术人,我每年都会做这样的预测分析,既是为了给…

2026/10/15 20:37:13 阅读更多 →
氨燃料燃烧仿真优化与NOx控制技术研究

氨燃料燃烧仿真优化与NOx控制技术研究

1. 氨燃料燃烧技术背景与行业需求在碳中和背景下,氨(NH3)作为零碳燃料正获得前所未有的关注。与传统碳基燃料相比,氨燃烧只产生氮气和水,理论上可实现完全零碳排放。但氨的燃烧特性也带来独特挑战:着火温度…

2026/10/15 20:37:13 阅读更多 →

最新新闻

MySQL零基础入门:从安装到增删改查实战教程

MySQL零基础入门:从安装到增删改查实战教程

写这篇教程的初衷很简单——我见过太多人一上来就啃官方文档,结果被术语劝退;也见过不少人背了一堆命令,却连数据库都没装好。MySQL作为最流行的开源关系型数据库,它其实没有传说中那么难,难的是没人告诉你第一步该干嘛…

2026/10/15 21:18:29 阅读更多 →
让AI Agent写出正确代码:自我验证闭环实战指南

让AI Agent写出正确代码:自我验证闭环实战指南

过去大半年,我一直在折腾 AI Agent 写真实业务代码。最头疼的不是它写不出来,而是它写出来的东西你不敢信:代码结构完整、命名也规范、注释还齐,结果一跑测试,边界条件炸了一地。后来听到一位在开发者工具领域深耕多年…

2026/10/15 21:18:29 阅读更多 →
大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南

大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南

大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 想让热门演出大麦抢票不再拼手速,靠的不…

2026/10/15 21:18:29 阅读更多 →
LoRA:大语言模型的低秩适应

LoRA:大语言模型的低秩适应

研究问题 预训练模型通常需要下游任务数据来继续训练模型,全参数微调更新全部参数:模型越大,梯度、优化器状态和任务专属模型副本的开销越高。 问题:能否只训练少量参数,获得接近全参数微调的效果,同时减少…

2026/10/15 21:18:29 阅读更多 →
华为OD机考100题含答案:从刷题到考场稳定发挥的完整指南

华为OD机考100题含答案:从刷题到考场稳定发挥的完整指南

简介:这份华为OD机考100题(含答案)docx文档,面向具备一定编程基础、正在准备华为OD机考或同类技术认证的开发者,帮助其系统熟悉机考题型与考察重点。文档精选100道经典真题,涵盖【5键键盘的输出】【N进制减…

2026/10/15 21:18:29 阅读更多 →
参考资源章节如何从“链接堆砌”变成文档导航页

参考资源章节如何从“链接堆砌”变成文档导航页

1. 第32章参考资源放在最后,却是读者最先翻的章节做技术文档这么多年,我越来越觉得“参考资源”是被误解最深的一章。大多数人以为它就是把链接堆在结尾,让读者自己去看,但实际上它决定了一本手册、一个项目文档能不能真正被人用起…

2026/10/15 21:17:27 阅读更多 →

日新闻

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/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

2026/10/15 19:41:51 阅读更多 →
影刀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 阅读更多 →