標籤:blog http io ar os sp 檔案 on div
在做檔案管理工具的過程中,有一個非常重要的功能實現,就是對不同的檔案類型擷取檔案的描述資訊,以及對檔案表徵圖的擷取
實現這個功能需要調用Windows API,以及對註冊表的操作(代碼是看了一些網上寫的後根據自己的理解寫了一個比較簡潔易懂的代碼)
下面看代碼:
//根據副檔名擷取表徵圖 public int fileExtIcon(string typeExt, FileInfo f) { if (!extIcon.ContainsKey(typeExt) && typeExt != ".exe") { RegistryKey regRead = Registry.ClassesRoot.OpenSubKey(typeExt); if (regRead == null) { return 0; } string subKey = regRead.GetValue("").ToString(); RegistryKey regRead1 = Registry.ClassesRoot.OpenSubKey(subKey); if (regRead1 == null) { return 0; } RegistryKey subKey1 = regRead1.OpenSubKey("DefaultIcon"); string defaultIcon = subKey1.GetValue("").ToString(); string[] defIcon = defaultIcon.Split(‘,‘); Icon ic = getExtractIcon(defIcon[0], int.Parse(defIcon[1])); TreeImageList.Images.Add(ic); extIcon.Add(typeExt, i++); return 0; } else if (typeExt == ".exe") { string fullPath = f.FullName; Icon ic = getExtractIcon(fullPath,0); if (ic != null) { TreeImageList.Images.Add(ic); extIcon.Add(typeExt, i++); } } return 0; }
這裡需要引用windows API
//擷取系統表徵圖 [DllImport("shell32.dll")] public static extern int ExtractIcon(IntPtr h, string strx, int ii); public Icon getExtractIcon(string fileName,int iIndex) { try { IntPtr hIcon = (IntPtr)ExtractIcon(this.Handle, fileName, iIndex); if (hIcon != IntPtr.Zero) { Icon icon = Icon.FromHandle(hIcon); return icon; } } catch(Exception e) { MessageBox.Show(e.Message,"錯誤提示",0,MessageBoxIcon.Error); } return null; }
還有一個問題沒解決,檔案盒檔案夾的表徵圖顯示不清晰,我不知道是不是ListView的原因
請各位指點
有問題或建議請聯絡[email protected]
C#類似windows資源管理員-擷取檔案表徵圖