使用Python手搓一個(gè)Windows注冊表清理器
前言
相信大家在使用 Windows 時(shí)都遇到過這種情況:直接刪除了軟件安裝目錄,或者卸載過程出錯(cuò),導(dǎo)致“設(shè)置 -> 應(yīng)用和功能”列表里依然殘留著軟件的圖標(biāo)。點(diǎn)擊卸載,系統(tǒng)只會(huì)彈窗提示“找不到文件”,看著非常難受(強(qiáng)迫癥噩夢)。
雖然市面上有各種管家類軟件,但為了這點(diǎn)小功能裝個(gè)大管家實(shí)在沒必要。作為開發(fā)者,不如利用 Python 自己動(dòng)手寫一個(gè)輕量級(jí)的清理工具。
本文將復(fù)盤整個(gè)開發(fā)過程,包括 注冊表掃描、UAC 管理員提權(quán)、Tkinter UI 美化 以及最終的 PyInstaller 打包。
項(xiàng)目源碼
本項(xiàng)目已開源至 Gitee,歡迎 Star 和 Fork!
Gitee 地址:https://gitee.com/sen2020/regedit-clean
核心思路
Windows 的“添加/刪除程序”列表,本質(zhì)上是讀取注冊表中的特定路徑。我們需要做的就是:
- 掃描:遍歷
HKCU(當(dāng)前用戶) 和HKLM(本地機(jī)器) 下的Uninstall注冊表項(xiàng)。 - 判斷:讀取每個(gè)軟件的
InstallLocation(安裝路徑),檢測該路徑在磁盤上是否存在。如果不存在,判定為“失效”。 - 展示:通過 GUI 列表展示失效項(xiàng),供用戶勾選。
- 清理:調(diào)用 Windows API 刪除選中的注冊表項(xiàng)。
效果圖

實(shí)現(xiàn)細(xì)節(jié)
1. 注冊表掃描 (winreg)
Python 自帶的 winreg 模塊足以應(yīng)對(duì)。我們需要關(guān)注的路徑通常是:Software\Microsoft\Windows\CurrentVersion\Uninstall
import winreg
import os
# 掃描邏輯簡化版
def scan():
scan_locations = [
(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Uninstall"),
(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"),
# 還要注意 64位系統(tǒng)下的 32位應(yīng)用注冊表
(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall")
]
for hive, subkey in scan_locations:
# ... 遍歷 EnumKey ...
# 讀取 InstallLocation 并使用 os.path.exists 判斷
2. 搞定管理員權(quán)限 (UAC)
要?jiǎng)h除 HKEY_LOCAL_MACHINE 下的內(nèi)容,必須擁有管理員權(quán)限。
為了體驗(yàn)更好,我實(shí)現(xiàn)了自動(dòng)提權(quán):程序啟動(dòng)時(shí)檢測是否為 Admin,如果不是,則通過 ShellExecuteW 重新以管理員身份啟動(dòng)自己。
這里有個(gè)坑:腳本運(yùn)行和打包后的 EXE 運(yùn)行,提權(quán)參數(shù)是不一樣的。
import ctypes
import sys
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if __name__ == "__main__":
if is_admin():
# 啟動(dòng)主程序 UI
root = tk.Tk()
app = RegistryCleanerApp(root)
root.mainloop()
else:
# 請(qǐng)求提權(quán)
try:
if getattr(sys, 'frozen', False):
# 如果是打包后的 exe
script_param = None
else:
# 如果是 .py 腳本
script_param = f'"{__file__}"'
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, script_param, None, 1)
sys.exit()
except Exception as e:
print(f"Failed to elevate: {e}")
3. UI 交互與美化 (Tkinter + Pillow)
原生 Tkinter 的 Checkbutton 在 Treeview (列表控件) 中支持得并不好,而且在高分屏下非常小,難以點(diǎn)擊。
解決方案:使用 Pillow 庫動(dòng)態(tài)繪制 24x24 像素的圖片(選中/未選中狀態(tài)),放入 Treeview 的第一列,模擬復(fù)選框。
from PIL import Image, ImageDraw, ImageTk
def create_checkbox_icons(self):
size = 24
# 繪制未選中方框
img_un = Image.new('RGBA', (size, size), (0, 0, 0, 0))
draw_un = ImageDraw.Draw(img_un)
draw_un.rectangle([2, 2, size-3, size-3], outline='#555555', width=2, fill='#FFFFFF')
self.icon_unchecked = ImageTk.PhotoImage(img_un)
# 繪制選中方框 (藍(lán)色背景 + 白色對(duì)勾)
img_chk = Image.new('RGBA', (size, size), (0, 0, 0, 0))
draw_chk = ImageDraw.Draw(img_chk)
draw_chk.rectangle([2, 2, size-3, size-3], outline='#0078D7', width=2, fill='#0078D7')
# ... 畫對(duì)勾邏輯 ...
self.icon_checked = ImageTk.PhotoImage(img_chk)
這樣不僅解決了點(diǎn)擊區(qū)域過小的問題,還讓界面看起來更像現(xiàn)代的 Win11 風(fēng)格。
4. 項(xiàng)目結(jié)構(gòu)工程化
為了避免項(xiàng)目雜亂,我將源碼和資源進(jìn)行了分離:
regeditClean/
├── src/ # 源代碼 (main.py 等)
├── assets/ # 資源文件 (圖標(biāo)、版本信息、截圖)
├── build_config/ # PyInstaller 配置目錄
├── dist/ # 最終 EXE 輸出
└── requirements.txt # 依賴庫
PyInstaller 打包
最后一步是將 Python 腳本打包成獨(dú)立的 .exe,方便在沒有 Python 環(huán)境的電腦上使用。
為了讓 EXE 看起來更正規(guī),我做了以下幾點(diǎn):
- 自定義圖標(biāo):生成了一個(gè)
.ico文件。 - 版本信息:創(chuàng)建
file_version_info.txt,寫入版權(quán)和版本號(hào)。 - 配置文件分離:將
.spec文件生成到build_config目錄,保持根目錄整潔。
打包命令:
pyinstaller --noconsole --onefile ^
--name="RegCleanTool" ^
--icon="assets\app_icon.ico" ^
--version-file="assets\file_version_info.txt" ^
--specpath="build_config" ^
--distpath="dist" ^
--workpath="build" ^
src\main.py
安全測試
為了驗(yàn)證工具的可靠性,絕對(duì)不能拿自己的系統(tǒng)注冊表開玩笑。
我編寫了一個(gè) create_test_entry.py 腳本,專門在 HKCU 下生成 5 個(gè)指向假路徑的注冊表項(xiàng)(例如指向 C:\Game\Ghost.exe)。通過“生成假數(shù)據(jù) -> 掃描 -> 清理 -> 驗(yàn)證”的閉環(huán)測試,確保了工具邏輯的嚴(yán)密性。
最終效果
(這里可以插入您的運(yùn)行截圖 assets/runtime.png)
工具完美運(yùn)行,成功識(shí)別并清理了測試生成的失效項(xiàng),且 UI 清晰易用。
到此這篇關(guān)于使用Python手搓一個(gè)Windows注冊表清理器的文章就介紹到這了,更多相關(guān)Python Windows注冊表清理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何利用python實(shí)現(xiàn)kmeans聚類
K-Means是聚類算法的一種,以距離來判斷數(shù)據(jù)點(diǎn)間的相似度并對(duì)數(shù)據(jù)進(jìn)行聚類,下面這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)kmeans聚類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Python多線程批量采集圖片的代碼實(shí)現(xiàn)
這篇文章主要給大家介紹了Python多線程批量采集圖片的代碼實(shí)現(xiàn),文中通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-05-05
keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解
這篇文章主要介紹了keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05

