程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 實現 popocat 回收站圖標更換

編輯:Python

1. 前提准備/思路記錄(思考過程,亂!)

剛開始各種搜索引擎,博客,搜集資料,前期准備,下面的步驟還是後期優化過的,剛開始是記錄各種有用的,思路很亂,代碼/成品可以直接看後面的

通過桌面【右擊】—>【個性化】—>【主題】—>【桌面圖標設置】—>【更改圖標】可以查看到默認的默認圖標是 imageres.dll ,這是 windos 默認的圖標庫。

Win 10 風格的圖標庫有:

  1. ddores.dll

  2. dmdskres.dll

  3. imageres.dll

  4. mmres.dll

  5. networkexplorer.dll

  6. pnidui.dll

  7. sensorscpl.dll

  8. setupapi.dll

  9. shell32.dll

  10. wmploc.dll

  11. wpdshext.dll 更多可以參考博客:Windos 圖標 dll

1.1. 思路記錄

剛開始什麼都不知道的時候,想著,編寫程序自動替換該 dll,調用網站轉換圖標格式:轉換 ico 然後編寫程序運行即可;
程序主要分為以下部分:

  1. 替換 dll

  2. 調用網站轉換圖標格式【可選】,也可通過程序調用

  3. 自動生成新的 dll【難度較大,可選】emmmm,不算很大,可以參考博文(C++)

  4. 修改注冊表,更新回收站的值

  5. 桌面圖標注冊表對應項

1.2. pythonmagick

第三方模塊(剛開始想寫 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 並保存

回收站圖標所在位置:

  1. 【還原】回收站默認圖標的位置: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon

  2. 【更改】回收站自定義圖標的位置: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon

    目錄下的項 emptyfull 的值分別對應回收站空和滿(非空)的時候的 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

2. 代碼分析

2.1. ICO 圖標轉換

將 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")

2.2. 生成 dll

這裡我是通過 VS 新建一個動態鏈接庫項目,然後導入上一步驟的 ico 文件,之後生成即可。也可以直接把 ico 後綴改成 dll,這樣的話下一步的代碼相關邏輯也需要改變一點點。

  1. 創建動態鏈接庫項目

  2. 添加資源文件(ico 圖標)

  3. 生成 dll

  4. 從生成的路徑下將 dll 復制(剪貼也行)一份備用。

2.3. 修改注冊表

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)

3. 成果展示

成果!我的大力!!!嗚嗚~

4. 資源分享

已經將相關代碼打包成 exe了,直接運行即可(僅限 Windows),mac 沒玩過,不知道,略。鏈接自取;
使用 pyinstaller 打包:

pyinstaller -F -i ./popocat_full.ico popocat.py

生成單文件 exe,但是沒法將外部文件打包進 exe 中,有自解壓可以打包進去,但是達不到想要的效果。
於是百度發現了 Enigma Virtual Box 打包軟件。

打包後的 exe 自取

5. 總結

雖然實際代碼看上去很短,但是確實不去了解的話真寫不出來,先是選擇 Java,發現貌似操作系統底層還是得 C 語言,換成 C 語言後寫出來了,但是句柄什麼的寫得我頭疼,最後發現了 winreg 這個 python 庫,確實好用,把許多無用(嚴謹點來說,是不常用)的參數都封裝起來了。

人沒事就得多折騰,折騰得多了,壽命也就沒了。
作者:睫毛進眼睛了!

游戲編程,一個游戲開發收藏夾~

如果圖片長時間未顯示,請使用Chrome內核浏覽器。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved