鼠标动画不动了

不知道从什么时候开始,鼠标指针的动画不动了,经过我再三确认,反复删除动画指针再添加,仍然是不动。

只有在变更之后点击应用的一瞬间是看到圈圈在转动的,其他时候不会动,就一个静态的图案。

尝试在谷歌上面找答案,唯一相关性较高的一个帖子是说要更新触控板的驱动,可是我的台式机也没有触控板啊,想装驱动的门都没。

https://www.sevenforums.com/customization/49705-animated-cursor-problem.html

大家有遇到过相同的问题吗?

你这什么系统版本啊,是原版还是精简的

你贴那个链接是2009年的啊 :joy:

我怀疑是因为近期为了某个软件更新了系统补丁后导致的情况,但是我没有证据。

版本 Windows 10 专业版
版本号 22H2
安装日期 ‎2022-‎04-‎08
OS 内部版本 19045.6456

是不是视觉效果里面的最佳外观/最佳性能的影响?

1 个赞

试过了,及时使用最佳外观模式也不行,系统也没有精简过。

1 个赞

你只能找软件的锅啊,微软已经不更新10了:joy:

1 个赞

能否分享一下这个光标的包?

1 个赞

会不会是自动隐藏鼠标指针的锅?

1 个赞

浅色版的是这个
https://zhutix.com/ico/breeze-snow-hd-cus/

深色版的是这个
https://zhutix.com/ico/breeze-cursors/

2 个赞

先生乃神人也,还真是Hide Mouse Cursor on Idle.ahk的问题。

丢给DEEPSEEK 看了一下,出了一版,暂时还没解决方法,望大佬们帮忙看看。我尝试给作者发个邮件看看会不会有回应,GITHUB上的时间都是很久远了。

; AutoHotkey Version: 1.x
; Language:       English
; Platform:       Win9x/NT
; Author:         Stefan Z Camilleri - [email protected]
#NoTrayIcon
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; Initialize the mouse cursor
SystemCursor("Init")

; Get the current mouse position, and store its coordinates
MouseGetPos mX0, mY0

; Set a timer to check if the mouse is still idle every 250ms
SetTimer, CheckIdle, 250

; Register the keys you want to listen on
keys = ``1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./

; For every defined key, register a call to hide the mouse cursor
Loop Parse, keys
   HotKey ~*%A_LoopField%, Hoty
return

; Checks if the mouse has moved, and if so, shows it and records the new position
CheckIdle:
MouseGetPos mX, mY
if (mX0 != mX && mY0 != mY)
{
    SystemCursor("On")
    mX0 := mX, mY0 := mY
}
return

; Hides the mouse cursor
Hoty:
   SystemCursor("Off")
return

; Ensure the cursor is made visible when the script exits.
#Persistent
    OnExit, ShowCursor
return

; Shows the mouse cursor
ShowCursor:
SystemCursor("On")
ExitApp

; Function to hide or show the mouse cursor
SystemCursor(OnOff=1)   ; INIT = "I","Init"; OFF = 0,"Off"; TOGGLE = -1,"T","Toggle"; ON = others
{
    static AndMask, XorMask, $, h_cursor
        ,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 ; system cursors
        , b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13   ; blank cursors
        , h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13   ; handles of default cursors

    if (OnOff = "Init" or OnOff = "I" or $ = "")       ; init when requested or at first call
    {
        $ = h                                          ; active default cursors
        VarSetCapacity( h_cursor,4444, 1 )
        VarSetCapacity( AndMask, 32*4, 0xFF )
        VarSetCapacity( XorMask, 32*4, 0 )
        system_cursors = 32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650
        StringSplit c, system_cursors, `,
        Loop %c0%
        {
            h_cursor   := DllCall( "LoadCursor", "uint",0, "uint",c%A_Index% )
            h%A_Index% := DllCall( "CopyImage",  "uint",h_cursor, "uint",2, "int",0, "int",0, "uint",0 )
            b%A_Index% := DllCall("CreateCursor","uint",0, "int",0, "int",0
                , "int",32, "int",32, "uint",&AndMask, "uint",&XorMask )
        }
    }

    if (OnOff = 0 or OnOff = "Off" or $ = "h" and (OnOff < 0 or OnOff = "Toggle" or OnOff = "T"))
        $ = b  ; use blank cursors
    else
        $ = h  ; use the saved cursors

    Loop %c0%
    {
        h_cursor := DllCall( "CopyImage", "uint",%$%%A_Index%, "uint",2, "int",0, "int",0, "uint",0 )
        DllCall( "SetSystemCursor", "uint",h_cursor, "uint",c%A_Index% )
    }
}

1 个赞

ani文件就是多帧cur文件合并加上类似gif的播放信息,所以鼠标指针的图像就是一帧一帧播放的,隐藏鼠标指针的脚本复制出来的是动画指针的第一帧,所以恢复出来的也只有第一帧
可以参考微软的 LoadAnimatedCursor 指令
——
我觉得是,找出里面哪些id是等待状态的指针,剔掉,只隐藏非动画指针就好,简单直接

1 个赞

很多软件本来就自带闲置隐藏鼠标,不带基本就是没这必要,所以为啥要用这个AHK?

1 个赞

是的,思路就是按您的思路,只替换正常指针,我用DS修改了几次,以下这一版运行效果良好。就是每次都创造新的句柄,然后再销毁,感觉不太合适,但是能用就行,代码这东西讲究缘分。

;#NoTrayIcon
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

; 需要隐藏的光标类型
cursorsToHide := [32512, 32513]  ; 箭头和文本选择光标
; 如果需要隐藏更多,可以添加:
; 32514 - 等待光标(沙漏/圆圈)
; 32515 - 十字光标
; 32516 - 手型光标

; 存储原始光标
originalCursors := {}
cursorHidden := false

; 初始化:保存需要隐藏的光标
SaveOriginalCursors()

; 获取并存储初始鼠标位置
MouseGetPos, mX0, mY0

; 设置定时器检查鼠标是否空闲
SetTimer, CheckIdle, 250

; 定义要监听的按键
keys := "``1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./"

; 为每个按键注册热键
Loop, Parse, keys
{
    Hotkey, ~*%A_LoopField%, HideCursors
}

return

CheckIdle:
    MouseGetPos, mX, mY
    if (mX != mX0 or mY != mY0)
    {
        if (cursorHidden)
        {
            RestoreOriginalCursors()
            cursorHidden := false
        }
        mX0 := mX
        mY0 := mY
    }
return

HideCursors:
    if (!cursorHidden)
    {
        SetBlankCursors()
        cursorHidden := true
    }
return

OnExit("RestoreOnExit")

RestoreOnExit()
{
    RestoreOriginalCursors()
    ExitApp
}

; 保存原始光标
SaveOriginalCursors()
{
    global originalCursors, cursorsToHide
    
    for index, cursorID in cursorsToHide
    {
        ; 获取当前系统光标
        hCursor := DllCall("LoadCursor", "Ptr", 0, "UInt", cursorID, "Ptr")
        
        ; 创建副本并保存
        hCursorCopy := DllCall("CopyImage", "Ptr", hCursor, "UInt", 2, "Int", 0, "Int", 0, "UInt", 0, "Ptr")
        
        originalCursors[cursorID] := hCursorCopy
    }
}

; 创建空白光标
CreateBlankCursor()
{
    VarSetCapacity(AndMask, 32*4, 0xFF)
    VarSetCapacity(XorMask, 32*4, 0)
    
    hCursor := DllCall("CreateCursor", "Ptr", 0, "Int", 0, "Int", 0, "Int", 32, "Int", 32, "Ptr", &AndMask, "Ptr", &XorMask, "Ptr")
    
    hCursorCopy := DllCall("CopyImage", "Ptr", hCursor, "UInt", 2, "Int", 0, "Int", 0, "UInt", 0, "Ptr")
    
    DllCall("DestroyCursor", "Ptr", hCursor)
    
    return hCursorCopy
}

; 设置空白光标
SetBlankCursors()
{
    global cursorsToHide
    
    for index, cursorID in cursorsToHide
    {
        ; 为每种光标创建新的空白光标
        blankCursor := CreateBlankCursor()
        
        ; 替换系统光标
        DllCall("SetSystemCursor", "Ptr", blankCursor, "UInt", cursorID)
    }
}

; 恢复原始光标
RestoreOriginalCursors()
{
    global originalCursors
    
    for cursorID, hOriginal in originalCursors
    {
        if (hOriginal != 0)
        {
            ; 创建原始光标的副本
            hCursorCopy := DllCall("CopyImage", "Ptr", hOriginal, "UInt", 2, "Int", 0, "Int", 0, "UInt", 0, "Ptr")
            
            ; 恢复系统光标
            DllCall("SetSystemCursor", "Ptr", hCursorCopy, "UInt", cursorID)
        }
    }
}


补充一下,以上脚本,只隐藏了ID 32512 32513这2个指针,也就是设置里面的“正常选择”和“文本选择指针”指针,可根据需要自行添加。

1 个赞

用这个Autohotkey脚本的主要目的是,在使用输入法打字的时候,指针经常遮挡我的候选词。而WIN10的“打字时隐藏鼠标指针”功能根本不起作用。所以用脚本来去弥补。

您说提到的软件自带隐藏,大概是指操作该软件的时候会隐藏鼠标,而不是打字的时候隐藏。功能不一样。

呃……我在用的鼠标指针连 I-beam 都是动画……
——

“很多软件”?除了视频播放工具外我没见过啥生产力软件是这样,能说说有哪些常见软件不?
“不带基本就是没这必要”?也不能这么说,Windows自己就带,可实现起来十分拉垮(为了兼容使用自定义指针的需求采取了一种极之被动的方式实现,而不是从系统底层给鼠标指针图层增加 visible 属性,很是让人疑惑),所以才有必要自己动手

——
已经通过AI的帮助,更新了重构版: 真正的“打字时隐藏鼠标指针”

更新:重构版【打字隐藏鼠标指针.ahk】,(以原版脚本为基础?)结合微软资料(winuser.h相关)和AI(Hunyuan & Gemini)重新编写的脚本,使用句柄取代简单图像提取,实现鼠标指针隐藏和恢复提示、可恢复原动画指针、可通过托盘菜单禁用。