Bazen yazılım geliştiriciler OpenFileDialog kullanılarak seçtiğiniz bir dosyanın icon'unu alma ihtiyacı duyuyorlar. Araştırdığım kadarıyla, bunun için Framewok 2.0'da herhangi bir yönetilebilen(managed) kod yok, onun için bu işlemi API yani yönetileyen(Unmanaged) kod ile yapmamız gerekiyor. İnternette yaptığım küçük araştırma sonucu nasıl yapılacağını anlatan bir MSDN kaynağına ulaştım. Aşağıdaki kısım, bahsettiğim kodun yönetilemeyen kısmı.
#region Unmanaged Code [StructLayout(LayoutKind.Sequential)] public struct SHFILEINFO { public IntPtr hIcon; public IntPtr iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; }; class Win32 { public const uint SHGFI_ICON = 0x100; public const uint SHGFI_LARGEICON = 0x0; // 'Large icon public const uint SHGFI_SMALLICON = 0x1; // 'Small icon [DllImport("shell32.dll")] public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); } #endregion
Bu Win32 isimli sınıfı nasıl kullanmamıza gelince;
Aşağıdaki küçük kod ile ile istediğiniz dosyanın büyük ve küçük icon'larına ulaşmanız mümkün.
IntPtr hImgSmall; //sistemin resim listelerine ulaşım IntPtr hImgLarge; //sistemin resim listelerine ulaşım string strFileName; // icon'unu alacağımız dosya adı. SHFILEINFO shinfo = new SHFILEINFO(); this.OpenFileAttahcment.InitialDirectory = "c:\\"; OpenFileAttahcment.Filter = "All files (*.*)|*.*"; OpenFileAttahcment.FilterIndex = 2; OpenFileAttahcment.RestoreDirectory = true; if (OpenFileAttahcment.ShowDialog() == DialogResult.OK) { strFileName = OpenFileAttahcment.FileName; //dosyanın iconunun küçük formatına ulaşım hImgSmall = Win32.SHGetFileInfo(strFileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON); //dosyanın iconunun küçük formatına ulaşım hImgLarge = Win32.SHGetFileInfo(strFileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON); System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon); FileInfo fInfo = new FileInfo(OpenFileAttahcment.FileName.ToString()); FileStream fStream = new FileStream(OpenFileAttahcment.FileName.ToString(),
FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fStream); long numBytes = fInfo.Length; byte[] data = br.ReadBytes((int)numBytes); br.Close(); fStream.Close();
Hepsi bu kadar... Yapmanız gereken, myIcon değişkenini istediğiniz yerde kullanmak.
Umarım yararlı olur...