dsh-whale-cursor
chen-en-run/dsh-whale-cursor
鼠标指针皮肤:鲸鱼娘白羽箭头与蓝发女仆立绘指针,打开开关即在 Harness 界面内生效,也可一键写进 Windows 系统光标并随时还原。它的 /state 路由通过 webServer.register 挂载,没有 DSH 的 Host/Origin 准入检查,所以浏览器里打开的任意网页都能改动光标设置。
安装
dsh plugin --profile web add github:chen-en-run/dsh-whale-cursorREADME
鲸鱼娘鼠标皮肤 · dsh-whale-cursor
给 DeepSeek Harness 换一套鼠标皮肤:白色箭头、鲸鱼尾鳍、几颗小气泡,或者直接把一张立绘做成指针。 既能在 DSH 界面内 即时生效,也能一键写进 Windows 系统光标,随时还原。
箭头 链接/手型 文本 I 型
↗ ☝ I

安装
插件市场:打开 DSH 的插件市场,搜索「鲸鱼娘鼠标皮肤」或 dsh-whale-cursor 安装即可。
命令行:
dsh plugin add https://github.com/Chen-en-run/dsh-whale-cursor
装完按 Ctrl+R 刷新页面,入口在 设置 → 鼠标皮肤。
功能
- DSH 内即时生效:打开开关,当前窗口的箭头、链接手型、文本 I 型全部换掉,不用重启。
- Windows 系统光标:同一套图写进注册表,桌面、浏览器、所有程序一起换;应用前自动备份,一键还原。
- 皮肤系统:设置页里有皮肤库,现在有「鲸鱼娘 · 白羽箭头」和「鲸尾蓝发的梦幻女仆少女」两套,结构上可以继续加别的形象。
- 两种画法都支持:矢量绘制的皮肤放大也清晰;位图皮肤直接读包里的 PNG,任意立绘都能做成指针。
- 零运行时依赖:PNG、CUR 编码、注册表操作全部自带,不依赖 sharp / canvas。
入口:设置 → 鼠标皮肤。
使用
- 打开 设置 → 鼠标皮肤。
- 「在 DSH 中启用」默认是开着的,装好刷新页面就能看到新指针;关掉开关即可恢复系统箭头。
- 想连系统一起换,点「应用到系统」。Windows 会先记住你原来的光标设置。
- 想改回去,点「还原系统光标」;只关 DSH 的话关掉开关就行。
系统光标只接管三个:Arrow、Hand、IBeam,其余(等待、调整大小、移动等)保持系统原样。
备份文件:%USERPROFILE%\.dsh\whale-cursor\cursors-backup.reg。
指针尺寸跟随 Windows 的系统光标设置:插件固定输出 32 / 48 两档位图,系统放大光标时会挑选最接近的一档再缩放,和系统自带光标的行为一致。想改指针大小请到「设置 → 辅助功能 → 鼠标指针」,插件不会去改写你的系统设置。
皮肤系统怎么扩展
一个皮肤就是一个模块,导出 meta 和 roles:
// lib/skins/my-character.js
export const meta = {
id: 'my-character',
name: { zh: '我的角色', en: 'My character' },
tagline: { zh: '一句话描述', en: 'One line' },
description: { zh: '更长的描述', en: 'Longer description' },
author: 'you',
accent: '#8FCEF3',
};
export const roles = {
arrow: { hotspot: [2, 1], draw(r) { /* r.fillPolygon(...) */ } },
hand: { hotspot: [10, 2], draw(r) { /* ... */ } },
text: { hotspot: [16, 16], draw(r) { /* ... */ } },
};
然后在 lib/skins/index.js 里 import 并加入 SKINS 数组。设置页的皮肤库、系统光标的写入都会自动跟随,不需要改客户端代码。
draw(r) 拿到的是 32×32 逻辑坐标系的 Raster:
| 方法 | 说明 |
|---|---|
r.fillPolygon(points, color) | 填充多边形 |
r.strokePolyline(points, width, color, closed?) | 描边折线,端点带圆角 |
r.fillCircle(cx, cy, r, color) | 圆 |
r.fillEllipse(cx, cy, rx, ry, color) | 椭圆 |
r.drawImage(png, { x, y, w, h }, { tint?, alpha? }) | 贴一张 RGBA 位图(面积平均采样,可染成纯色做描边) |
颜色支持 #rgb / #rrggbb / #rrggbbaa。矢量皮肤按目标尺寸重新渲染而不是缩放位图:运行时 DSH 内用 32px,系统光标用 32 / 48 两档。
位图皮肤
「鲸尾蓝发的梦幻女仆少女」就是位图皮肤,可以照着抄:

- 把原图处理成透明背景的 PNG,放进
lib/skins/assets/。 - 皮肤模块里
decodePng(fs.readFileSync(...))读一次并缓存(lib/png.js自带解码器)。 draw(r)里r.drawImage(artwork, frame)贴到 32 单位画布上。
原图去白底那一步在 tools/build-maid.mjs:从四边泛洪只清掉与外部连通的近白像素(角色身上的白围裙、白头饰不会被误伤),再把边界像素降透明度去掉白边光晕,最后裁到外接框、缩到 512px。跑法:
node tools/build-maid.mjs path/to/原图.png # 写 lib/skins/assets/maid-girl.png
tools/ 下的脚本只是开发期用的,需要本机装好 sharp(npm i -g sharp 或放在任意能 require 到的地方,用 DSH_SHARP_BASE 指向那个 package.json)。插件运行时完全不依赖它。
开发
node tools/preview.mjs # 渲染各皮肤各尺寸 PNG + 拼版预览到 tools/out
node tools/smoke.mjs # 离线跑一遍宿主路由、生成 .cur、校验文件
tools/preview.mjs 的输出里 <皮肤>-sheet.png 是 128px 原图和 32px 最近邻放大的对照,方便检查小尺寸下的可读性。
目录:
index.js 宿主半边:HTTP 路由 /dsh-whale-cursor-7a1c/state
client.js 客户端半边:设置页 + 注入光标 CSS
lib/raster.js 多边形/圆/椭圆的超采样光栅器,以及位图贴图
lib/png.js PNG 编解码(zlib)
lib/cur.js Windows .cur 编码
lib/system.js 注册表读写、备份还原、刷新光标
lib/skins/ 皮肤注册表与具体形象
lib/skins/assets/ 位图皮肤的素材
locale/ 插件元数据(设置页导航里的标题与描述)
assets/ 商店图标与截图
实现说明
- DSH 内:客户端通过
ctx.styles.insert注入cursor:url(...)规则,选择器覆盖html body, html body *,并给按钮/链接、输入框分别换上手型与 I 型图;规则带!important,才压得住组件自己的cursor:pointer。三张图都是宿主渲染好的 32px PNG data URL,热点来自assets[role].hotspot。指针大小由 Windows 的光标设置决定,浏览器会按系统光标尺寸缩放这张图。 - 系统:渲染 32 / 48 两档写成
.cur,用reg add写HKCU\Control Panel\Cursors,再调用SystemParametersInfo(SPI_SETCURSORS)刷新;失败时回退rundll32 user32.dll,UpdatePerUserSystemParameters。旧版本写过的CursorBaseSize会在插件启动时按cursor-meta.json还原一次。 - .cur 的坑:
ICONDIRENTRY的wPlanes/wBitCount字段在光标文件里存的是热点坐标,图像数据是裸 DIB——写错的话文件看着正常,但LoadCursorFromFile返回 0。
已知限制
- 系统光标部分仅支持 Windows;其他平台只提供 DSH 内的皮肤。
- 只接管箭头 / 手型 / I 型三个光标,忙碌、调整大小等仍是系统光标(避免影响拖拽手感)。
- 指针尺寸不由插件控制:浏览器会把
cursor:url()按系统的光标大小缩放,所以改大小请用 Windows 的指针设置。
License
MIT