Mesut KOSUCU
Savrulma Düşlerim, Borandır Bu... RSS 2.0   
Mesut
İletişim
mkosucu@gmail.com
 Thursday, November 15, 2007
C# Kullanarak Dosyaların Icon'larını Ulaşma

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...

 

Thursday, November 15, 2007 3:35:25 AM (GMT Standard Time, UTC+00:00)  #    Comments [0] -


Visual Studio
Comments are closed.
Kategoriler
 Genel
 jQuery
 Politika
 Teknoloji
 Visual Studio
Navigasyon
The Code Project
Developer Express Inc.
ASP.NET
Martin Fowler
WindowsClient.net
Takip Ettiklerim
 ASP.NET Daily Articles
 ASP.NET How Do I? Videos
 Engineering Windows 7
 Hasan Ayaz
 Hasan Ayaz / Technojection
 Kıvanç Özüölmez
 Latest Microsoft Blogs
 Martin Fowler
 Mehmet Nuri Çankaya
 Murat Yılmaz
 Tamer Öz
Arşiv
<November 2008>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456