KB5120998 (26100.9278) 安装后登录不加载自定义鼠标指针方案,SPI_SETCURSORS 失败

alva cui 40 信誉分
2026-08-28T06:21:13.49+00:00

问题描述: 安装 2026-08-27 的累积更新 KB5120998(OS Build 26100.9278)并重启后,用户级自定义鼠标指针方案不再被应用到桌面,屏幕光标回到系统默认。该方案在更新前一直正常。

复现步骤:

  1. 在 HKCU\Control Panel\Cursors 设置自定义指针方案(值指向 C:\Windows\Cursors<方案文件夹>\ 内的第三方 .cur/.ani,Scheme Source=1)
  2. 安装 KB5120998 并重启
  3. 登录后鼠标指针显示为系统默认样式

技术观察:

  • 注册表值、主题文件、文件 ACL 全部完好;以同一账户 LoadCursorFromFile() 加载相同文件返回有效句柄
  • 在交互会话中调用 SystemParametersInfo(SPI_SETCURSORS, 0, NULL, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE) 返回 FALSE 且 GetLastError()=0,光标不刷新
  • GetCursorInfo 显示当前箭头句柄为系统共享句柄 0x00010003(即 LoadCursor(NULL, IDC_ARROW)),而非从 .cur 文件加载的私有句柄,说明方案加载环节被跳过
  • SetSystemCursor() 正常可用,可手动恢复方案;但注销/重启后再次失效
  • 辅助功能设置 CursorType=0(自定义)未被改动;C:\Windows\Cursors 的 ACL 正常(Users:(RX))

预期结果:登录时按 HKCU\Control Panel\Cursors 加载指针方案 实际结果:登录后为默认光标,且 SPI_SETCURSORS 重载通道失败

系统信息:

  • 版本:Windows 11 24H2 内核(Windows 10 IoT Enterprise LTSC 2024,Build 26100.9278)
  • 相关更新:KB5120998(LCU)、KB5120997(SSU)、KB5122385,2026-08-28 安装
Windows 商业版 | 适用于 IoT 的 Windows

2 个答案

排序依据: 非常有帮助
  1. Steve Hsu 0 信誉分
    2026-08-28T12:32:57.5933333+00:00

    根据技术观察,用LLM辅助写了一个临时缓解措施脚本,注销/重启后失效。

    建立一个新 powershell 脚本(*.ps1),把以下内容复制进去,保存,然后以管理员身份运行。

    已在本地测试,有效。

    # 鼠标指针临时修复脚本
    # 用法:以管理员身份运行 PowerShell,执行此脚本
    # 注意:注销或重启后需再次运行
    
    Add-Type -TypeDefinition @"
    using System;
    using System.Runtime.InteropServices;
    public class CursorFix {
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern IntPtr LoadImageW(
            IntPtr hInstance,
            string lpFileName,
            uint uType,
            int cxDesired,
            int cyDesired,
            uint fuLoad
        );
    
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool SetSystemCursor(
            IntPtr hcur,
            uint id
        );
    }
    "@
    
    # Windows SDK winuser.h
    $cursorMap = @{
        "Arrow"       = 32512   # IDC_ARROW
        "IBeam"       = 32513   # IDC_IBEAM
        "Wait"        = 32514   # IDC_WAIT
        "Crosshair"   = 32515   # IDC_CROSS
        "UpArrow"     = 32516   # IDC_UPARROW
        "SizeNWSE"    = 32642   # IDC_SIZENWSE
        "SizeNESW"    = 32643   # IDC_SIZENESW
        "SizeWE"      = 32644   # IDC_SIZEWE
        "SizeNS"      = 32645   # IDC_SIZENS
        "SizeAll"     = 32646   # IDC_SIZEALL
        "No"          = 32648   # IDC_NO
        "Hand"        = 32649   # IDC_HAND
        "AppStarting" = 32650   # IDC_APPSTARTING
        "Help"        = 32651   # IDC_HELP
        "Pin"         = 32671   # IDC_PIN
        "Person"      = 32672   # IDC_PERSON
    }
    
    # 从注册表读取当前光标方案路径
    $regPath = "HKCU:\Control Panel\Cursors"
    $schemes = Get-ItemProperty -Path $regPath
    
    Write-Host "Loading custom cursor file path from registry..." -ForegroundColor Cyan
    
    $loadedCount = 0
    $failedList = @()
    
    foreach ($valueName in $cursorMap.Keys) {
        $cursorPath = $schemes.$valueName
    
        if ($cursorPath -and (Test-Path $cursorPath)) {
            # 获取该注册表值对应的正确系统ID
            $systemId = $cursorMap[$valueName]
    
            try {
                # 加载光标文件
                # IMAGE_CURSOR = 2, LR_LOADFROMFILE = 0x0010
                $hCursor = [CursorFix]::LoadImageW([IntPtr]::Zero, $cursorPath, 2, 0, 0, 0x0010)
                if ($hCursor -ne [IntPtr]::Zero) {
                    # 应用光标
                    $result = [CursorFix]::SetSystemCursor($hCursor, $systemId)
                    if ($result) {
                        $loadedCount++
                        Write-Host "  APPLIED: $valueName (ID:$systemId) -> $cursorPath" -ForegroundColor Green
                    } else {
                        $failedList += $valueName
                        Write-Host "  FAILED: $valueName (ID:$systemId, ErrCode: $([System.Runtime.InteropServices.Marshal]::GetLastWin32Error()))" -ForegroundColor Red
                    }
                } else {
                    $failedList += $valueName
                    Write-Host "  FAILED TO LOAD: $valueName" -ForegroundColor Red
                }
            } catch {
                $failedList += $valueName
                Write-Host "  EXCEPTION: $valueName - $_" -ForegroundColor Red
            }
        } else {
            # 如果注册表里没有这个值(某些方案可能缺失),跳过
            Write-Host "  - SKIPPING: $valueName (undefined in registry)" -ForegroundColor Gray
        }
    }
    
    Write-Host "`nCOMPLETE. $loadedCount / $($cursorMap.Count) cursors applied." -ForegroundColor Cyan
    if ($failedList.Count -gt 0) {
        Write-Host "WARNING:Failed to apply: $($failedList -join ', ')" -ForegroundColor Yellow
    }
    Write-Host "NOTICE:This is just a temporary mitigation and will be lost after logout or restart." -ForegroundColor Yellow
    
    

    此答案是否有帮助?

    7 个人认为此答案很有帮助。

  2. Brien Jiang 0 信誉分
    2026-08-29T16:44:22.3366667+00:00

    我也出现此问题,希望早点修复

    此答案是否有帮助?

    0 个注释 无注释

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。