我的“此电脑”被流氓快捷方式塞满了,一个 4 天写完的开源小工具是怎么把它赶走的 我的“此电脑”被流氓快捷方式塞满了一个 4 天写完的开源小工具是怎么把它赶走的【免费下载链接】MyComputerManager管理“此电脑”里删不掉的流氓“快捷方式”包括侧边栏同时可自己添加这类“快捷方式”项目地址: https://gitcode.com/gh_mirrors/my/MyComputerManager打开文件资源管理器发现“此电脑”里多了个从来没装过的网盘图标右键想删菜单里压根没有“删除”这一项。遇到这种场面的不止你一个。这类图标本质上不是“快捷方式”而是通过 Windows Shell Extension 挂在“此电脑”界面里的注册表项普通用户几乎无路可走。本文要聊的 MyComputerManager就是专门收拾这些“删不掉的图标”的开源小工具——它既能把顽固图标禁掉或删干净也能反过来让你把自己的常用文件夹、游戏加进“此电脑”。下文会从它的源码出发讲讲这个 WPF 小工具是怎么一步步啃下注册表和图标提取这两块硬骨头的。先说说你的“此电脑”为什么会长出别人家的图标正常来说“此电脑”里该出现的就是本地磁盘、DVD 这些系统项。但第三方软件尤其是国内某些全家桶想让自己的云盘、网盘图标常年驻留在“此电脑”里时走的是一条官方后门注册表的 NameSpace 键。Windows 的资源管理器在渲染“此电脑”时会去读这么两段注册表路径HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpaceNameSpace 下的每一个子键名都是一个 CLSID形如{B416D21B-...}的 GUID。资源管理器看到这个 GUID再去HKEY_CLASSES_ROOT\CLSID\{该GUID}里查它的名称、图标、打开命令然后渲染成一个图标挂在界面上。所以删掉 NameSpace 下对应子键图标自然消失。原理讲起来就一句话但实操时处处是坑——下面逐个说。上图是这个工具最直观的卖点同样是“此电脑”左边被各种网盘图标塞满右边清理之后只剩系统必要项。可以对照着看下文提到的禁用/删除逻辑分别产生哪种效果。第一道坎同一个 CLSID可能藏在四种注册表视图里如果你动手试过手动清理多半会栽在第一步按网上教程打开 CLSID死活找不到那个 GUID 子键。这不怪你这是 Windows 注册表经典的“视图分裂”问题。一个 CLSID 的定义可能存在于 HKCU当前用户或 HKLM本机同时还分 64 位原生视图和 32 位视图。不同软件写注册表时选择的路不一样你只查一种视图自然扑空。MyComputerManager 的扫描逻辑NamespaceHelper.GetItemsInternal里就用了一个四级回退来处理这个问题// 依次尝试HKCU → HKLM → HKCU(32位视图) → HKLM(32位视图) var clsidkey Registry.CurrentUser.OpenSubKey(SOFTWARE\Classes\CLSID); var itemkey clsidkey?.OpenSubKey(item); if (itemkey null) itemkey Registry.LocalMachine.OpenSubKey(SOFTWARE\Classes\CLSID)?.OpenSubKey(item); if (itemkey null) itemkey RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32) .OpenSubKey(SOFTWARE\Classes\CLSID)?.OpenSubKey(item); if (itemkey null) itemkey RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) .OpenSubKey(SOFTWARE\Classes\CLSID)?.OpenSubKey(item);这段代码要解决的核心问题是NameSpace 里拿到的是 GUID 字符串但它的“身世信息”名称、默认图标、执行命令得去 CLSID 里查。上面每一行都在扩大搜索范围直到找到为止。也正是因为这里做了 32 位视图回退很多老软件用 32 位进程写入的条目才不至于被漏掉。扫描时还会顺手读几个常用值默认值是显示名称DefaultIcon是图标路径Shell\Open\Command是点击后执行的命令InfoTip是悬停提示。一个NamespaceItem对象就此成型主界面上那个列表就是这些对象绑定的结果。顺带一提文件里还同时扫描了MyComputer和Desktop两类路径——后者对应的正是资源管理器侧边栏里那个树状目录很多网盘图标也会出现在那里。只删不保留太冒险所以作者默认让你“禁用”拿到项目列表后怎么处理粗暴地直接删注册表子键当然也能解决问题但 MyComputerManager 给你的是两个不同量级的操作禁用和删除。禁用的实现很有讲究它用到了 Windows 自带的一对“仓库”...\Explorer\MyComputer\NameSpace // 正常显示 ...\Explorer\MyComputer\NameSpaceDisabled // 被禁用的项目对应源码NamespaceHelper.SetEnabled的逻辑其实只是“搬家”把 GUID 子键从NameSpace挪到NameSpaceDisabled界面上图标立刻消失想恢复再挪回来。整个过程不动 CLSID 定义、不删任何数据天然可逆if (isEnabled) { // 从 Disabled 仓库搬回正常仓库 var ns item.RegKey.CreateSubKey(...\Explorer\MyComputer\NameSpace); var nsDisabled item.RegKey.CreateSubKey(...\Explorer\MyComputer\NameSpaceDisabled); ns.CreateSubKey(item.CLSID); nsDisabled.DeleteSubKey(item.CLSID); }这设计对用户非常友好不确定某个项目是不是系统关键组件时先禁用试两天出问题随时恢复而不是一上来就“永别”。真正的删除操作在DeleteItem里它会连同 NameSpace 子键和 CLSID 定义一起DeleteSubKeyTree掉所以界面上会弹红色警告“无法恢复”。图标去哪了exe、dll、ico 三种文件三种取法项目列表渲染前还得解决一个不大不小的问题CLSID 里存的图标路径五花八门.ico、.exe、.dll都有而 WPF 的ImageSource并不认识.exe和.dll。这就需要IconHelper.ReadIcon做分发处理if (f.Extension.ToLower() .ico) { // ico用 IconBitmapDecoder 拆帧优先选 32 位 BGRA、尺寸最大的那一帧 var frames new IconBitmapDecoder(stream, PreservePixelFormat, None).Frames.ToList(); return frames.OrderBy(x x.Format PixelFormats.Bgra32 ? 1 : 2) .ThenByDescending(x x.PixelHeight).First(); } else if (f.Extension.ToLower() .exe) { // exeSHGetFileInfoW 拿系统图标索引再 SHGetImageList 取出大尺寸图标 return BitmapHelper.ToBitmapSource( IconHelper.ReadIconFromExe(iconPath, IconSize.ExtraLarge).ToBitmap()); } else if (f.Extension.ToLower() .dll) { // dllPrivateExtractIcons 暴力抽取挑第一张带透明通道的位图 return BitmapHelper.ToBitmapSource(IconHelper.ReadIconFromDll(iconPath)); }三种方案的取舍也值得留意.ico用 WPF 自带的解码器最省事.exe走SHGetFileInfoWSHGetImageList这套系统 API能拿到资源管理器同款高清图标.dll则直接 P/InvokePrivateExtractIcons从资源里把所有图标抽出来再挑一张Format32bppArgb带透明通道的返回。这段代码藏在整个项目最容易被忽略的Helpers/Icon/目录里却是“图标显示是否清晰、是否带毛边”的关键。顺手把“添加项目”也做成了正经功能能删就能加。这个工具并不满足于当个清理器详情页DetailPage.xaml可以直接新建一个项目填名称、描述、悬停提示图标可以点按钮选择也可以直接把 exe/ico/dll 文件拖到窗口上ImageDrop里对拖入文件做了扩展名校验路径参数还能一键复制。保存时走的是NamespaceHelper.UpdateItem在 CLSID 下写DefaultIcon值会拼上,0表示取第 0 号图标、Shell\Open\Command写启动命令同时在 NameSpace 里注册 GUID。提交后会立即出现在“此电脑”里。这套“添加”能力配合上面的“禁用”等于把 Windows 给开发者留的后门变成普通用户也能安全使用的开关。详情页还有一个细节值得夸导出按钮会调用 regedit 的命令行参数把项目的 CLSID 定义和 NameSpace 注册导出成一个.reg文件——删之前导出一份等于买了保险。界面部分作者选用了开源 Win11 风格控件库 wpf-ui即 WPF-UI配合 Win11 的 Mica 效果做了亮暗两套主题项目本身基于 .NET Framework 4.7.2 WPF用 MvvmLight 管绑定、用 Microsoft.Extensions.Hosting 做依赖注入和页面导航。作者在 README 里坦言整个程序是 4 天赶出来的但为了兼容性特意用了老框架——这点对 WPF 学习者反而是好事代码路径不绕顺着MainPageViewModel和DetailPageViewModel就能把整条数据流读完。常见问题速览问题原因与对策禁用后重启电脑图标又回来了软件在启动时把 GUID 重新写回了 NameSpace重新禁用或直接删除删除按钮太吓人担心误删系统项删除确实不可恢复建议先点“导出”保存 .reg 备份再用禁用观察工具打不开、操作时报“找不到 key”修改 HKLM 下注册表需要管理员权限右键以管理员身份运行图标显示成空白或低清CLSID 里的图标路径失效或指向不存在的文件可重新指定 exe/ico/dll侧边栏也有一堆不想要的项目扫描时已区分“此电脑”和“侧边栏(Desktop)”两类在列表里同样可禁用/删除下一步怎么玩如果你被“此电脑”里的顽固图标困扰了很久这个工具最务实的用法就三步下载运行 → 找到对应项目 → 先禁用、不满意再删除。如果你是 WPF 或注册表编程的入门开发者它的源码更值得一读——项目不大却完整覆盖了自定义控件、样式重写、Mvvm 绑定、异步命令、依赖注入、页面导航这些 WPF 必修课Helpers/NamespaceHelper.cs和Helpers/Icon/IconHelper.cs是两个最值得精读的入口。想本地跑起来直接克隆仓库后用 Visual Studio 打开解决方案编译即可git clone https://gitcode.com/gh_mirrors/my/MyComputerManager建议拿到手先做一件事打开源码搜NameSpaceDisabled你会发现“禁用”这个看似平凡的功能背后其实是对 Windows 注册表机制的尊重——能少动系统一分就绝不多动一分。【免费下载链接】MyComputerManager管理“此电脑”里删不掉的流氓“快捷方式”包括侧边栏同时可自己添加这类“快捷方式”项目地址: https://gitcode.com/gh_mirrors/my/MyComputerManager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考