想把 `.exe`、`.txt` 或自訂副檔名的圖標換成自己喜歡的 `.ico`?本文詳述註冊表結構、手動修改步驟,並提供完整的 C 語言 Win32 API 實作代碼,助你輕鬆掌握文件關聯圖標自訂技術。
HKEY_CLASSES_ROOT ├─ .exe (預設值 = "exefile") │ └─ ... (其他副檔名同理) ├─ exefile │ └─ DefaultIcon (預設值 = 圖標路徑,如 "%1" 表示使用檔案內嵌圖標) └─ ... (其他 ProgID)
RegCreateKeyEx:開啟/建立鍵值,返回句柄。RegQueryValueEx:讀取鍵值數據 (取得 ProgID)。RegSetValueEx:寫入鍵值數據 (設定圖標路徑)。RegCloseKey:務必成對呼叫,釋放句柄,避免洩漏。#include <windows.h>
#include <tchar.h>
#include <stdio.h>
BOOL SetFileIcon(LPCTSTR pszExt, LPCTSTR pszIconPath) {
HKEY hKeyExt, hKeyProgID, hKeyIcon;
TCHAR szProgID[MAX_PATH];
DWORD dwSize = sizeof(szProgID);
LONG lRes;
// 1. 開啟副檔名鍵,讀取 ProgID
lRes = RegCreateKeyEx(HKEY_CLASSES_ROOT, pszExt, 0, NULL, 0, KEY_READ, NULL, &hKeyExt, NULL);
if (lRes != ERROR_SUCCESS) return FALSE;
lRes = RegQueryValueEx(hKeyExt, NULL, NULL, NULL, (LPBYTE)szProgID, &dwSize);
RegCloseKey(hKeyExt);
if (lRes != ERROR_SUCCESS) return FALSE;
// 2. 開啟 ProgID\DefaultIcon 鍵
TCHAR szIconKey[MAX_PATH];
_stprintf(szIconKey, _T("%s\\DefaultIcon"), szProgID);
lRes = RegCreateKeyEx(HKEY_CLASSES_ROOT, szIconKey, 0, NULL, 0, KEY_WRITE, NULL, &hKeyIcon, NULL);
if (lRes != ERROR_SUCCESS) return FALSE;
// 3. 寫入圖標路徑
DWORD cbData = (lstrlen(pszIconPath) + 1) * sizeof(TCHAR);
lRes = RegSetValueEx(hKeyIcon, NULL, 0, REG_SZ, (LPBYTE)pszIconPath, cbData);
RegCloseKey(hKeyIcon);
// 4. 通知 Shell 更新 (可選)
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
return (lRes == ERROR_SUCCESS);
}
int main() {
if (SetFileIcon(_T(".txt"), _T("C:\\Icons\\mytxt.ico")))
_tprintf(_T("成功修改 .txt 圖標!\n"));
else
_tprintf(_T("修改失敗,請檢查權限與路徑。\n"));
return 0;
}
掌握這套機制,你就能為安裝程式、桌面工具、檔案管理器增添專屬視覺識別,提升使用者體驗。