LiChen-CN 2026-03-24 12:13 采纳率: 100%
浏览 79
已结题

[Windows 11 独占] VSCode 右键菜单中文乱码

问题现象概述

使用 HiBitUninstaller 扫描注册表后,VSCode 用户版(User Installer)的右键菜单项“通过 Code 打开”显示为中文乱码。菜单功能正常,仅显示异常。

操作环境与软件版本

操作系统
Windows 11(24H2 及 25H2 均能复现)
VSCode 版本
VSCodeUserSetup-x64-1.111.0(安装时勾选了“将‘通过 Code 打开’添加到文件上下文菜单”)
清理工具版本
HiBit Uninstaller 4.0.10(安装版)


问题发现与排查过程

1. 问题复现背景

HiBit Uninstaller 是我日常使用的清理工具,功能稳定。一个月前将其更新至最新版后,我重新卸载并安装了 VSCode,并在安装时手动勾选了以下三项(其中第一项默认未勾选):
将“通过 Code 打开”操作添加到 Windows 资源管理器文件上下文菜单
将 Code 注册为受支持的文件类型的编辑器
添加到 PATH(重启后生效)

在一次例行注册表扫描后,发现右键菜单中的“通过 Code 打开”变为中文乱码,但菜单功能仍正常。

2. 已尝试的修复方法

参考 CSDN 上现有的唯一一篇 VSCode 右键菜单乱码修复教程,按其指引的注册表路径(如 HKEY_CLASSES_ROOT*\shell\VSCode)进行排查和修复,但该路径在 Windows 11 中不存在,推测该方法仅适用于 Windows 10。
在虚拟机中多次重建环境,进行大量对照实验,得出以下关键结论:


仅 Windows 11 复现:Windows 10 环境下使用相同软件版本执行相同操作,未出现乱码。
与用户名无关:无论使用微软账户还是本地账户,中文或英文用户名,均能稳定复现。
扫描即触发:仅需执行 HiBit Uninstaller 的注册表扫描(无需清理),即可导致乱码。
普通卸载无效:直接卸载 VSCode 并重装,乱码仍然存在,必须使用 HiBit Uninstaller 的注册表清理功能后重装,才能恢复正常显示。


3. 已进行的深入分析

使用 ProcMon 对清理工具进行实时监控,未发现其对 VSCode 相关注册表项进行直接修改或删除。
使用 RegShot 对“乱码前/后”进行快照对比,未定位到有效差异。
排查HKEY_CLASSES_ROOT下VSCodeContextMenu键,Title值正常,未被修改。
检查 HKEY_CURRENT_USER\Software\Classes下是否存在覆盖项,未发现异常(也可能是本人技术不佳,没能发现)。

由于本人技术能力有限,虽收集了大量监控数据,但仍无法准确定位问题根源,特向各位寻求帮助。

需求方向

希望大家能帮忙回答以下几点:

  1. 为什么该问题仅在Windows11系统中出现呢?
  2. HiBit Uninstaller为什么在扫描阶段造成了中文乱码呢?
  3. 是否有办法在不重装系统的情况下,彻底重置或修复 VSCode 的右键菜单状态?

如需测试,我已将相关版本软件上传至个人网站:
http://download.luolichen.top/
(包含 HiBit Uninstaller 4.0.10 和 VSCode 1.111.0 用户版安装包)

非常感谢各位的帮助!

  • 写回答

5条回答 默认 最新

  • Sponge_F 2026-03-28 19:31
    关注

    最近我也遇到了这个问题

    先说解决方法:

    win+r 后输入regedit,打开注册表编辑器,删除 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VSCodeContextMenu 这一项,就是直接删除名为VSCodeContextMenu前面有文件夹图标的那一个;
    或者打开VSCodeContextMenu 这一项,在右边区域右键-新建-可扩充字符串值,名称填写 Title ,数据填写 通过 Code 打开 。


    推测造成此现象的原因

    通过虚拟机复现并使用RegistryChangesView对比HiBit Uninstaller 4.0.10扫描前后的注册表状态,发现其创建了大量空注册表项,看样子像是把 HKCU\Software\Classes 中的项,在 HKLM\SOFTWARE\Classes 里批量创建了空项副本;经测试,VSCodeContextMenu 在 HKLM 中的优先级比在 HKCU 中更高,系统读取到 HKLM 里面空的 VSCodeContextMenu 项,触发右键菜单显示异常。但是一般来说HKCU的优先级应该是高于HKLM的,不知道为什么对于VSCodeContextMenu而言HKLM优先级更高,至少在虚拟机中测试下来是这样的。


    生成的空注册表项清理

    我不清楚其余的空项是否会造成别的什么影响,于是让AI写了一个清理脚本,其行为是:以管理员权限清理 HKLM\SOFTWARE\Classes 中与 HKCU\Software\Classes 同名且为空的注册表项,操作前支持注册表备份,列出待删项并需手动输入 YES 确认删除,全程不修改 HKCU 内容。
    脚本使用方法:win+s搜索Windows PowerShell,以管理员身份运行 ,粘贴脚本内容,回车,之后按提示选择是否备份注册表,确认后扫描并列出待删项,输入 YES 即可删除 HKLM 中对应空注册表项。

    以下为脚本内容:

    <#
    清理 HKLM:\SOFTWARE\Classes 中与 HKCU:\Software\Classes 重复的空注册表项
    ✅ 极速优化(解决扫描慢)| 实时显示数量 | 备份 | 先列项→最后总数 | YES确认删除
    #>
    
    # 路径定义
    $hkcuPath = "HKCU:\Software\Classes"
    $hklmPath = "HKLM:\SOFTWARE\Classes"
    $desktop = [Environment]::GetFolderPath("Desktop")
    
    # 管理员检查
    $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
    if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
        Write-Error "请以管理员身份运行 PowerShell!"
        pause
        exit 1
    }
    
    Write-Host "`n===== 注册表空项清理工具 =====" -ForegroundColor Cyan
    Write-Host "对比路径:"
    Write-Host "HKCU: $hkcuPath"
    Write-Host "HKLM: $hklmPath`n"
    
    # 备份
    $backup = Read-Host "是否导出注册表备份到桌面?(Y/N)"
    if ($backup -eq 'Y' -or $backup -eq 'y') {
        Write-Host "`n正在导出备份,请稍候..." -ForegroundColor Cyan
        $fileHKCU = Join-Path $desktop "HKCU_Classes_Backup.reg"
        $fileHKLM = Join-Path $desktop "HKLM_Classes_Backup.reg"
    
        reg export "HKCU\Software\Classes" "`"$fileHKCU`"" /y > $null 2>&1
        reg export "HKLM\SOFTWARE\Classes" "`"$fileHKLM`"" /y > $null 2>&1
    
        Write-Host "备份已保存到桌面:" -ForegroundColor Green
        Write-Host "1. $fileHKCU"
        Write-Host "2. $fileHKLM`n"
    }
    else {
        Write-Warning "已跳过备份,继续操作将不可逆!!!`n"
    }
    
    Write-Host "按回车开始扫描..."
    Read-Host
    
    # ===================== 极速优化核心:预加载HKLM所有项 =====================
    Write-Host "`n🔍 初始化扫描环境..." -ForegroundColor Cyan
    $hklmExistItems = @{}
    if (Test-Path $hklmPath) {
        Get-ChildItem $hklmPath -ErrorAction SilentlyContinue | ForEach-Object {
            $hklmExistItems[$_.PSChildName] = $true
        }
    }
    
    # 初始化计数
    $scanCount = 0
    $toDelete = @()
    
    # 初始显示
    Write-Host "`r🔍 正在扫描 | 已扫描: $scanCount | 已找到待删: $($toDelete.Count)" -ForegroundColor Cyan -NoNewline
    
    # 高速扫描(内存匹配,速度提升100倍)
    if (Test-Path $hkcuPath) {
        $hkcuNames = Get-ChildItem $hkcuPath | Select-Object -ExpandProperty PSChildName
    
        foreach ($name in $hkcuNames) {
            $scanCount++
            # 内存匹配,不反复查询注册表
            if ($hklmExistItems.ContainsKey($name)) {
                $hklmItem = Join-Path $hklmPath $name
                $key = Get-Item $hklmItem -ErrorAction SilentlyContinue
                if ($null -ne $key) {
                    $hasSubkeys = $key.GetSubKeyNames().Count -gt 0
                    $hasValues  = $key.GetValueNames().Count -gt 0
                    if (-not $hasSubkeys -and -not $hasValues) {
                        $toDelete += $hklmItem
                    }
                }
            }
    
            # 实时同步显示:已扫描 + 已找到
            Write-Host "`r🔍 正在扫描 | 已扫描: $scanCount | 已找到待删: $($toDelete.Count)" -ForegroundColor Cyan -NoNewline
        }
    }
    
    # 扫描结束换行
    Write-Host "`n"
    
    # 显示结果
    Write-Host "`n===== 待删除的空项列表 =====" -ForegroundColor Green
    
    # 无项目:提示+按回车退出,不直接关闭
    if ($toDelete.Count -eq 0) {
        Write-Host "未找到任何需要删除的空项。`n" -ForegroundColor Green
        pause
        exit
    }
    
    # 逐条显示
    foreach ($item in $toDelete) {
        Write-Host "→ $item" -ForegroundColor Red
    }
    
    # 列完后显示总数
    Write-Host "`n=====================================" -ForegroundColor Cyan
    Write-Host "✅ 扫描完成,待删除项总数:$($toDelete.Count)" -ForegroundColor Green
    Write-Host "=====================================`n"
    
    Write-Host "警告:删除后无法撤销!" -ForegroundColor Yellow
    $confirm = Read-Host "请输入 YES 确认删除,其他内容退出(不区分大小写)"
    
    # 支持大小写 YES/yes
    if ($confirm -eq 'YES' -or $confirm -eq 'yes') {
        Write-Host "`n开始删除..." -ForegroundColor Cyan
        foreach ($item in $toDelete) {
            Write-Host "删除: $item"
            Remove-Item $item -Force -ErrorAction SilentlyContinue
        }
        Write-Host "`n删除完成!请重启文件资源管理器或电脑。`n" -ForegroundColor Green
    }
    else {
        Write-Host "已取消,未删除任何项。`n"
    }
    
    pause
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月24日