Windows 可執行文件(.exe)和動態庫文件(.dll)圖標資源提取工具
功能
- 圖標資源預覽
- 圖標資源導出(僅支持導出 PNG 格式)
代碼
獲取圖標資源使用了 Win32 API PrivateExtractIconsW
PrivateExtractIconsW 對應的 C# 代碼
[DllImport("User32.dll")]
internal static extern uint PrivateExtractIcons(
/* _In_reads_(MAX_PATH) */ string szFileName,
/* _In_ */ int nIconIndex,
/* _In_ */ int cxIcon,
/* _In_ */ int cyIcon,
/* _Out_writes_opt_(nIcons) */ IntPtr[] phicon,
/* _Out_writes_opt_(nIcons) */ uint[] piconid,
/* _In_ */ uint nIcons,
/* _In_ */ uint flags);
參數:
szFileName 要從中提取圖標的文件的路徑和名稱。
nIconIndex 要提取的第一個圖標的從零開始的索引。例如,如果此值為零,則該函數會提取指定文件中的第一個圖標。
cxIcon 想要的水平圖標大小。
cyIcon 想要的垂直圖標大小。
phicon 指向返回的圖標句柄數組的指針。
piconid 指向最適合當前顯示設備的圖標的返回資源標識符的指針。
nIcons 要從文件中提取的圖標數。此參數僅在從 .exe 和 .dll 文件中提取時有效。
flags 指定控制此功能的標志。
主要步驟
- 需要先獲取文件中的圖標總數量。phicon 參數為 NULL,返回值為文件中的圖標數
int _nIcons = PrivateExtractIcons(filePath, 0, 0, 0, null, null, 0, 0);
- 獲取所有圖標資源句柄。返回值為獲取到的圖標數量
IntPtr[] phicon = new IntPtr[_nIcons];
uint[] piconid = new uint[_nIcons];
uint nIcons = PrivateExtractIcons(filePath, 0, 32, 32, phicon, piconid, _nIcons, 0);
- 轉換成位圖。需要釋放資源
for (int i = 0; i < nIcons; i++)
{
Icon icon = Icon.FromHandle(phicon[i]);
Bitmap bitmap = icon.ToBitmap();
icon.Dispose();
_ = DestroyIcon(phicon[i]);
}