鼠标拖尾演示怎么实现

计算控制点带来的性能开销可以说微乎其微了。所有计算加上绘制所需的时间都不到 1ms,这还是 js 在 web 上的开销,如果换成 C++ 之类的原生实现应该还会小不少。

laser-pen/README.ZH_CN.MD at main · SilentTiger/laser-pen (github.com)

1 个赞

我找到一个类似的、用autohotkey加了透明和置顶。
但是只有白色,还很简陋,还会干扰打字,抛砖引玉一下。
01

2 个赞

鼠标拖尾的演示效果感觉也能通过 GestureSign - 开源鼠标手势工具,支持触摸版、触摸屏、触控笔、鼠标[Windows] 实现,开启鼠标轨迹,另外需要注意的是,尽量不和设定的鼠标手势冲突。
缺点就是,不如Laser Pen演示的顺滑,末端拖尾不能实现收窄。但还是能够实现自由圈画的目的。

4 个赞

最接近楼主答案的可能是《鼠标引擎》里面的这个效果吧: Steam Workshop::Line mouse-trail

运行截图

运行演示视频:

==编辑:======
楼主要的全局桌面端LaserPen已经导入转换好了,这里下载(可能要梯子访问,或者直接在软件里面直接下载此插件使用):Steam Workshop::LaserPen

1 个赞

这个只能在本网页演示? ,有没有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
}

3 个赞

我找了好几年,找到一个windows平台的,名称zanzomouse.exe,日本网友开发的。

有颜色,透明度,长度,粗细调节功能。基本够用,主要是不够平滑,停止鼠标后,还会有一些点叠在光标下面不自然。

占用cpu很低。

image.png

和我推荐的很像了,不够平滑,占用cpu稍微高一点,设置不能保存用,开始进设置影响效率。再优化一下就更多好了。

哈哈,看到开发者了!!:grinning_face:

:collision: 能不能把你的项目打包成exe直接给我们小白使用呢?:spouting_whale: 目前我对比了几个,就你的这个最平滑了最舒服了。

github也提了需求了。

这是web 上的 放不到exe里面给你用。。。

意思只能用其它语言实现,不是平移吗?好可惜。

我目前用的几个同类工作,效果没有这个网面的好,而且笔记本的风扇会转起来,说明cpu占用多,虽然占用在5%-15%之间。

要性能吗?rust搞给呗,让AI做。

说实话,也许老了不是很喜欢花里胡哨的动画

这东西就是做录屏和教学演示时候用,平时不用。