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

實現(xiàn)細(xì)節(jié)
1. 注冊表掃描 (winreg)
Python 自帶的 winreg 模塊足以應(yīng)對。我們需要關(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)
要刪除 HKEY_LOCAL_MACHINE 下的內(nèi)容,必須擁有管理員權(quán)限。
為了體驗更好,我實現(xiàn)了自動提權(quán):程序啟動時檢測是否為 Admin,如果不是,則通過 ShellExecuteW 重新以管理員身份啟動自己。
這里有個坑:腳本運行和打包后的 EXE 運行,提權(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():
# 啟動主程序 UI
root = tk.Tk()
app = RegistryCleanerApp(root)
root.mainloop()
else:
# 請求提權(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 (列表控件) 中支持得并不好,而且在高分屏下非常小,難以點擊。
解決方案:使用 Pillow 庫動態(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)色背景 + 白色對勾)
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')
# ... 畫對勾邏輯 ...
self.icon_checked = ImageTk.PhotoImage(img_chk)
這樣不僅解決了點擊區(qū)域過小的問題,還讓界面看起來更像現(xiàn)代的 Win11 風(fēng)格。
4. 項目結(jié)構(gòu)工程化
為了避免項目雜亂,我將源碼和資源進(jìn)行了分離:
regeditClean/
├── src/ # 源代碼 (main.py 等)
├── assets/ # 資源文件 (圖標(biāo)、版本信息、截圖)
├── build_config/ # PyInstaller 配置目錄
├── dist/ # 最終 EXE 輸出
└── requirements.txt # 依賴庫
PyInstaller 打包
最后一步是將 Python 腳本打包成獨立的 .exe,方便在沒有 Python 環(huán)境的電腦上使用。
為了讓 EXE 看起來更正規(guī),我做了以下幾點:
- 自定義圖標(biāo):生成了一個
.ico文件。 - 版本信息:創(chuàng)建
file_version_info.txt,寫入版權(quán)和版本號。 - 配置文件分離:將
.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
安全測試
為了驗證工具的可靠性,絕對不能拿自己的系統(tǒng)注冊表開玩笑。
我編寫了一個 create_test_entry.py 腳本,專門在 HKCU 下生成 5 個指向假路徑的注冊表項(例如指向 C:\Game\Ghost.exe)。通過“生成假數(shù)據(jù) -> 掃描 -> 清理 -> 驗證”的閉環(huán)測試,確保了工具邏輯的嚴(yán)密性。
最終效果
(這里可以插入您的運行截圖 assets/runtime.png)
工具完美運行,成功識別并清理了測試生成的失效項,且 UI 清晰易用。
到此這篇關(guān)于使用Python手搓一個Windows注冊表清理器的文章就介紹到這了,更多相關(guān)Python Windows注冊表清理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解
這篇文章主要介紹了keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

