剛開始各種搜索引擎,博客,搜集資料,前期准備,下面的步驟還是後期優化過的,剛開始是記錄各種有用的,思路很亂,代碼/成品可以直接看後面的
通過桌面【右擊】—>【個性化】—>【主題】—>【桌面圖標設置】—>【更改圖標】可以查看到默認的默認圖標是 imageres.dll
,這是 windos 默認的圖標庫。
Win 10 風格的圖標庫有:
ddores.dll
dmdskres.dll
imageres.dll
mmres.dll
networkexplorer.dll
pnidui.dll
sensorscpl.dll
setupapi.dll
shell32.dll
wmploc.dll
wpdshext.dll
更多可以參考博客:Windos 圖標 dll
剛開始什麼都不知道的時候,想著,編寫程序自動替換該 dll,調用網站轉換圖標格式:轉換 ico 然後編寫程序運行即可;
程序主要分為以下部分:
調用網站轉換圖標格式【可選】,也可通過程序調用
自動生成新的 dll【難度較大,可選】emmmm,不算很大,可以參考博文(C++)
修改注冊表,更新回收站的值
桌面圖標注冊表對應項
第三方模塊(剛開始想寫 GUI,找到了 TKInterDesigner,但是有 BUG,我的電腦用不了,暫且擱置):
pythonmagick,不能 pip install,需要手動 下載,注意甄別版本以及CPU架構(通過命令查看 pip debug --verbose,我的是 cp38-cp38-win_amd64)!cp10對應的 python 版本3.10,cp38 對應 python 版本3.8
import PythonMagickimg = PythonMagick.Image("logo.png") # 加載需要轉換的圖片img.sample('64x64') # 設置生成的 icon 的大小img.write("logo.ico") # 生成 icon 並保存
回收站圖標所在位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon
【更改】回收站自定義圖標的位置: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon
目錄下的項
empty
、full
的值分別對應回收站空和滿(非空)的時候的 icon 圖標位置;
[HKEY_CURRENT_USER\Software\Classes\CLSID](WIN9X)
或 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID](WIN2000/XP)
中定義了某系統文件夾的圖標或名稱,它的優先級將高於[ HKEY_CLASSES_ROOT\CLSID
]。桌面上的我的電腦、我的文檔、網上鄰居等圖標和名稱均在此定義。項的值的類型都是 REG_EXPAND_SZ,數據分別是: (默認): %SystemRoot%\System32\imageres.dll,-55
Empty: %SystemRoot%\System32\imageres.dll,-55
Full: %SystemRoot%\System32\imageres.dll,-54
將 icons 文件夾下的圖片轉換為 ico 文件並存儲在 iocn 文件夾下;
import osimport PythonMagickdef get_files(): filenames = os.listdir(os.path.join(os.getcwd(), 'icons')) for index, item in enumerate(filenames): filenames[index] = './icons/' + item return filenamesdef convert(sava_path): if not os.path.exists(sava_path) or os.path.isfile(sava_path): os.mkdir(sava_path) else: os.mkdir(sava_path) filenames = get_files() for item in filenames: img = PythonMagick.Image(item) # 加載需要轉換的圖片 img.sample('256x256') # 設置生成的 icon 的大小 img.write('./icon/' + item[8:len(item) - 3] + 'ico') # 生成 icon 並保存if __name__ == '__main__': convert("icon")
這裡我是通過 VS 新建一個動態鏈接庫項目,然後導入上一步驟的 ico 文件,之後生成即可。也可以直接把 ico 後綴改成 dll,這樣的話下一步的代碼相關邏輯也需要改變一點點。
添加資源文件(ico 圖標)
生成 dll
從生成的路徑下將 dll 復制(剪貼也行)一份備用。
dll 文件需要存儲在本地,所以選擇存儲在了 TEMP 文件夾下,存儲在其他文件夾下也可以,不建議存儲在 system32 下。
import osimport winregdll_name = "cookie_icon.dll"dll_dir_path = os.path.join(os.getenv("TEMP"), "{645FF040-5081-101B-9F08-00AA002F954E}")dll_file_path = os.path.join(dll_dir_path, dll_name)key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\\Microsoft\\Windows\\CurrentVersion\\" r"Explorer\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}" r"\\DefaultIcon", 0, winreg.KEY_ALL_ACCESS)try: winreg.SetValueEx(key, "empty", 0, winreg.REG_EXPAND_SZ, dll_file_path + ",0") winreg.SetValueEx(key, "full", 0, winreg.REG_EXPAND_SZ, dll_file_path + ",1") print("更換成功~雙擊回收站後查看效果") # TODO: 加入刷新機制,刷新一下桌面,實現後無需點回收站就可以看到圖標更新效果 # 目前網上找到的大部分都是 taskkill explorer.exe 然後重啟,會導致桌面短暫卡死,產生僵屍進程 os.system("pause")except WindowsError as e: print("WindowsError: " + e)finally: winreg.CloseKey(key)
成果!我的大力!!!嗚嗚~
已經將相關代碼打包成 exe了,直接運行即可(僅限 Windows),mac 沒玩過,不知道,略。鏈接自取;
使用 pyinstaller 打包:
pyinstaller -F -i ./popocat_full.ico popocat.py
生成單文件 exe,但是沒法將外部文件打包進 exe 中,有自解壓可以打包進去,但是達不到想要的效果。
於是百度發現了 Enigma Virtual Box 打包軟件。
打包後的 exe 自取
雖然實際代碼看上去很短,但是確實不去了解的話真寫不出來,先是選擇 Java,發現貌似操作系統底層還是得 C 語言,換成 C 語言後寫出來了,但是句柄什麼的寫得我頭疼,最後發現了 winreg 這個 python 庫,確實好用,把許多無用(嚴謹點來說,是不常用)的參數都封裝起來了。
人沒事就得多折騰,折騰得多了,壽命也就沒了。
作者:睫毛進眼睛了!
游戲編程,一個游戲開發收藏夾~
如果圖片長時間未顯示,請使用Chrome內核浏覽器。