2011-05-15 17 views
12

मैं अपने कंप्यूटर पर संग्रहीत फ़ाइलों को ब्राउज़ करने के लिए ऐप की तरह एक्सप्लोरर बना रहा हूं। मेरा ऐप "आइकन" दृश्य में होगा। सवाल यह है कि: exe फ़ाइल का आइकन कैसे प्रदर्शित करें?प्रोग्राम आइकन प्राप्त करें

उत्तर

19

ऐसा करने के कई तरीके हैं। सबसे आसान शायद System.Drawing के लिए एक संदर्भ जोड़ने के लिए और Icon.ExtractAssociatedIcon विधि का लाभ उठाने है: एक और विकल्प

public static ImageSource GetIcon(string fileName) 
{ 
    Icon icon = Icon.ExtractAssociatedIcon(fileName); 
    return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
       icon.Handle, 
       new Int32Rect(icon.Width, icon.Height), 
       BitmapSizeOptions.FromEmptyOptions()); 
} 

, आप System.Drawing का उपयोग नहीं करना चाहते हैं, SHGetFileInfo एपीआई से आइकन प्राप्त करने के लिए है। यह अधिक कठिन है, लेकिन यह भी अधिक लचीला है; उदाहरण के लिए आप एक्सटेंशन के आधार पर मौजूद फ़ाइल का आइकन प्राप्त कर सकते हैं (निश्चित रूप से निष्पादन योग्य के लिए यह बहुत उपयोगी नहीं है, क्योंकि यह निष्पादन योग्य फ़ाइलों के लिए डिफ़ॉल्ट आइकन लौटाएगा)।

public static ImageSource GetIcon(string path, bool smallIcon, bool isDirectory) 
{ 
    // SHGFI_USEFILEATTRIBUTES takes the file name and attributes into account if it doesn't exist 
    uint flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES; 
    if (smallIcon) 
     flags |= SHGFI_SMALLICON; 

    uint attributes = FILE_ATTRIBUTE_NORMAL; 
    if (isDirectory) 
     attributes |= FILE_ATTRIBUTE_DIRECTORY; 

    SHFILEINFO shfi; 
    if (0 != SHGetFileInfo(
       path, 
       attributes, 
       out shfi, 
       (uint)Marshal.SizeOf(typeof(SHFILEINFO)), 
       flags)) 
    { 
     return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
        shfi.hIcon, 
        Int32Rect.Empty, 
        BitmapSizeOptions.FromEmptyOptions()); 
    } 
    return null; 
} 

[StructLayout(LayoutKind.Sequential)] 
private struct SHFILEINFO 
{ 
    public IntPtr hIcon; 
    public int iIcon; 
    public uint dwAttributes; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
    public string szDisplayName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
    public string szTypeName; 
} 

    [DllImport("shell32")] 
    private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint flags); 

private const uint FILE_ATTRIBUTE_READONLY = 0x00000001; 
private const uint FILE_ATTRIBUTE_HIDDEN = 0x00000002; 
private const uint FILE_ATTRIBUTE_SYSTEM = 0x00000004; 
private const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010; 
private const uint FILE_ATTRIBUTE_ARCHIVE = 0x00000020; 
private const uint FILE_ATTRIBUTE_DEVICE = 0x00000040; 
private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; 
private const uint FILE_ATTRIBUTE_TEMPORARY = 0x00000100; 
private const uint FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200; 
private const uint FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400; 
private const uint FILE_ATTRIBUTE_COMPRESSED = 0x00000800; 
private const uint FILE_ATTRIBUTE_OFFLINE = 0x00001000; 
private const uint FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000; 
private const uint FILE_ATTRIBUTE_ENCRYPTED = 0x00004000; 
private const uint FILE_ATTRIBUTE_VIRTUAL = 0x00010000; 

private const uint SHGFI_ICON = 0x000000100;  // get icon 
private const uint SHGFI_DISPLAYNAME = 0x000000200;  // get display name 
private const uint SHGFI_TYPENAME = 0x000000400;  // get type name 
private const uint SHGFI_ATTRIBUTES = 0x000000800;  // get attributes 
private const uint SHGFI_ICONLOCATION = 0x000001000;  // get icon location 
private const uint SHGFI_EXETYPE = 0x000002000;  // return exe type 
private const uint SHGFI_SYSICONINDEX = 0x000004000;  // get system icon index 
private const uint SHGFI_LINKOVERLAY = 0x000008000;  // put a link overlay on icon 
private const uint SHGFI_SELECTED = 0x000010000;  // show icon in selected state 
private const uint SHGFI_ATTR_SPECIFIED = 0x000020000;  // get only specified attributes 
private const uint SHGFI_LARGEICON = 0x000000000;  // get large icon 
private const uint SHGFI_SMALLICON = 0x000000001;  // get small icon 
private const uint SHGFI_OPENICON = 0x000000002;  // get open icon 
private const uint SHGFI_SHELLICONSIZE = 0x000000004;  // get shell size icon 
private const uint SHGFI_PIDL = 0x000000008;  // pszPath is a pidl 
private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010;  // use passed dwFileAttribute 

इस दृष्टिकोण का एक और लाभ यह है कि यह भी एक निर्देशिका के लिए आइकन (कोड में अंतिम संपादन देखें), जिसके साथ Icon.ExtractAssociatedIcon

+6

OMG कि मौजूद है संभव नहीं है मिल सकता है। –

+0

यह सुविधा WPF में मौजूद है? – Cobold

+0

कौन सी सुविधा? Icon.ExtractAssociatedIcon? यह WPF का हिस्सा नहीं है, लेकिन यह .NET Framework में है। सिस्टम। ड्रॉइंग सिर्फ जीडीआई –

संबंधित मुद्दे