计算控制点带来的性能开销可以说微乎其微了。所有计算加上绘制所需的时间都不到 1ms,这还是 js 在 web 上的开销,如果换成 C++ 之类的原生实现应该还会小不少。
laser-pen/README.ZH_CN.MD at main · SilentTiger/laser-pen (github.com)
计算控制点带来的性能开销可以说微乎其微了。所有计算加上绘制所需的时间都不到 1ms,这还是 js 在 web 上的开销,如果换成 C++ 之类的原生实现应该还会小不少。
laser-pen/README.ZH_CN.MD at main · SilentTiger/laser-pen (github.com)
我找到一个类似的、用autohotkey加了透明和置顶。
但是只有白色,还很简陋,还会干扰打字,抛砖引玉一下。

鼠标拖尾的演示效果感觉也能通过 GestureSign - 开源鼠标手势工具,支持触摸版、触摸屏、触控笔、鼠标[Windows] 实现,开启鼠标轨迹,另外需要注意的是,尽量不和设定的鼠标手势冲突。
缺点就是,不如Laser Pen演示的顺滑,末端拖尾不能实现收窄。但还是能够实现自由圈画的目的。
最接近楼主答案的可能是《鼠标引擎》里面的这个效果吧: Steam Workshop::Line mouse-trail
运行截图
运行演示视频:
==编辑:======
楼主要的全局桌面端LaserPen已经导入转换好了,这里下载(可能要梯子访问,或者直接在软件里面直接下载此插件使用):Steam Workshop::LaserPen
这个只能在本网页演示? ,有没有windows版本
大佬,怎么安装在电脑的指
针上?
最近gpt5出了,我让gpt5做一个ahk版本的,结果真的几下子就做出来了!分享一下,不过cpu占用较高,适合录屏时候用一下,平时用会拉低电脑运行效率:
exe版下载地址:
通过网盘分享的文件:Laser Pen ahk版.exe
链接: https://pan.baidu.com/s/1tptxTtqRCPB5MiInKD4tBQ?pwd=a78a 提取码: a78a
#SingleInstance force
#Persistent
SetBatchLines, -1
CoordMode,mouse,screen
; 需要 Gdip.ahk
#Include <Gdip>
; 初始化 GDI+
if !pToken := Gdip_Startup()
{
MsgBox, Gdiplus failed to start. Please include Gdip.ahk library!
ExitApp
}
; 获取虚拟屏幕范围 (支持多显示器)
SysGet, vx, 76 ; SM_XVIRTUALSCREEN
SysGet, vy, 77 ; SM_YVIRTUALSCREEN
SysGet, vw, 78 ; SM_CXVIRTUALSCREEN
SysGet, vh, 79 ; SM_CYVIRTUALSCREEN
; 默认参数
global trailLife := 800 ; 尾迹时长 (ms)
global trailWidth := 12 ; 尾迹最大宽度
global colorMode := "Rainbow" ; 颜色模式: Rainbow / Mono
global monoHue := 0 ; 单色模式的色相(0=红,120=绿,240=蓝)
global glowSize := 15 ; 光点大小
; 创建透明绘制窗口(覆盖整个虚拟屏)
Gui, +AlwaysOnTop -Caption +ToolWindow +E0x20 +LastFound
Gui, Show, x%vx% y%vy% w%vw% h%vh%, Trail
hwnd := WinExist()
WinSet, ExStyle, +0x80000, ahk_id %hwnd% ; WS_EX_LAYERED
hdc := DllCall("GetDC", "uint", hwnd, "ptr")
hdcMem := CreateCompatibleDC(hdc)
hbm := CreateDIBSection(vw, vh, hdc)
obm := SelectObject(hdcMem, hbm)
G := Gdip_GraphicsFromHDC(hdcMem)
Gdip_SetSmoothingMode(G, 4)
points := []
SetTimer, UpdateTrail, 16
;====================
; 设置窗口
Gui,2:+AlwaysOnTop
Gui,2:Add, Text,, 尾迹时长(ms):
Gui,2:Add, Edit, vtrailLifeEdit w80, %trailLife%
Gui,2:Add, Text,, 最大宽度:
Gui,2:Add, Edit, vtrailWidthEdit w80, %trailWidth%
Gui,2:Add, Text,, 颜色模式:
Gui,2:Add, DropDownList, vcolorModeChoice Choose1 w100, Rainbow|Mono, %colorMode%
Gui,2:Add, Text,, 单色Hue (0-360):
Gui,2:Add, Edit, vmonoHueEdit w80, %monoHue%
Gui,2:Add, Text,, 光点大小:
Gui,2:Add, Edit, vglowSizeEdit w80, %glowSize%
Gui,2:Add, Button, gApplySettings, 应用设置
Gui,2:Show, x50 y50, Laser Pen 设置
return
;====================
ApplySettings:
Gui,2:Submit, NoHide
trailLife := trailLifeEdit
trailWidth := trailWidthEdit
colorMode := colorModeChoice
monoHue := monoHueEdit
glowSize := glowSizeEdit
return
;====================
UpdateTrail:
MouseGetPos, mx, my ; 获取鼠标屏幕坐标 (全局)
; --- 转换为相对虚拟屏幕的坐标 ---
relX := mx - vx
relY := my - vy
points.Push({x: relX, y: relY, t: A_TickCount})
now := A_TickCount
Gdip_GraphicsClear(G, 0x00000000)
lastX := relX, lastY := relY
Loop % points.MaxIndex()
{
i := points.MaxIndex() - A_Index + 1
p := points[i]
age := now - p.t
if (age > trailLife) {
points.RemoveAt(i)
continue
}
fade := 1 - (age / trailLife)
width := trailWidth * fade + 1
alpha := Round(200 * fade)
if (colorMode="Rainbow") {
hue := Mod(p.t//6, 360)
} else {
hue := monoHue
}
color := HSLtoARGB(alpha, hue, 1.0, 0.5)
pen := Gdip_CreatePen(color, width)
Gdip_DrawLine(G, pen, lastX, lastY, p.x, p.y)
Gdip_DeletePen(pen)
lastX := p.x, lastY := p.y
}
; 光点(两层:亮点+光晕)
;brush1 := Gdip_BrushCreateSolid(0xFFFFEEAA) ; 白黄亮点
;Gdip_FillEllipse(G, brush1, relX-glowSize/2, relY-glowSize/2, glowSize, glowSize)
;Gdip_DeleteBrush(brush1)
brush2 := Gdip_BrushCreateSolid(0x55FF6600) ; 橙色光晕
Gdip_FillEllipse(G, brush2, relX-glowSize, relY-glowSize, glowSize*2, glowSize*2)
Gdip_DeleteBrush(brush2)
; 更新到分层窗口
UpdateLayeredWindow(hwnd, hdcMem, vx, vy, vw, vh)
return
;====================
Esc:: ; 按 ESC 退出
Gdip_DeleteGraphics(G)
SelectObject(hdcMem, obm), DeleteObject(hbm), DeleteDC(hdcMem), ReleaseDC(hwnd, hdc)
Gdip_Shutdown(pToken)
ExitApp
return
;====================
HSLtoARGB(a, h, s, l) {
c := (1 - Abs(2*l-1)) * s
x := c * (1 - Abs(Mod(h/60,2)-1))
m := l - c/2
if (h < 60)
r:=c, g:=x, b:=0
else if (h < 120)
r:=x, g:=c, b:=0
else if (h < 180)
r:=0, g:=c, b:=x
else if (h < 240)
r:=0, g:=x, b:=c
else if (h < 300)
r:=x, g:=0, b:=c
else
r:=c, g:=0, b:=x
r := Round((r+m)*255), g := Round((g+m)*255), b := Round((b+m)*255)
return (a<<24) | (r<<16) | (g<<8) | b
}
我找了好几年,找到一个windows平台的,名称zanzomouse.exe,日本网友开发的。
有颜色,透明度,长度,粗细调节功能。基本够用,主要是不够平滑,停止鼠标后,还会有一些点叠在光标下面不自然。
占用cpu很低。

和我推荐的很像了,不够平滑,占用cpu稍微高一点,设置不能保存用,开始进设置影响效率。再优化一下就更多好了。
github也提了需求了。
这是web 上的 放不到exe里面给你用。。。
意思只能用其它语言实现,不是平移吗?好可惜。
我目前用的几个同类工作,效果没有这个网面的好,而且笔记本的风扇会转起来,说明cpu占用多,虽然占用在5%-15%之间。
要性能吗?rust搞给呗,让AI做。
说实话,也许老了不是很喜欢花里胡哨的动画
这东西就是做录屏和教学演示时候用,平时不用。