我自己做的文件管理系统,能够扫出电脑里文件和文件夹。
有没有办法把他们的图标和系统图标关联起来?就像windows那样。
还有那些文件怎么直接调用系统程序运行啊?
我是菜鸟,谢谢各位大哥大姐...

解决方案 »

  1.   

    到注册表root下找对应扩展名的项
      

  2.   

    把系统的文件图标设置到listView1和listView2中
                //获得系统的ImageList
                int LVM_SETIMAGELIST = 0x1003;            API.SHFILEINFO sfi = new API.SHFILEINFO();
                IntPtr Small = API.SHGetFileInfoW(@"c:\", 0, ref sfi, (uint)Marshal.SizeOf(sfi), API.FILE_FLAG.SHGFI_ICON | API.FILE_FLAG.SHGFI_SYSICONINDEX | API.FILE_FLAG.SHGFI_SMALLICON);
                int SmallInt = Small.ToInt32();            API.SendMessage(listView1.Handle, LVM_SETIMAGELIST, (int)API.FILE_FLAG.SHGFI_SMALLICON, SmallInt);
                API.SendMessage(listView2.Handle, LVM_SETIMAGELIST, (int)API.FILE_FLAG.SHGFI_SMALLICON, SmallInt);            IntPtr Large = API.SHGetFileInfoW(@"c:\", 0, ref sfi, (uint)Marshal.SizeOf(sfi), API.FILE_FLAG.SHGFI_ICON | API.FILE_FLAG.SHGFI_SYSICONINDEX | API.FILE_FLAG.SHGFI_LARGEICON);
                int LargeInt = Large.ToInt32();            API.SendMessage(listView1.Handle, LVM_SETIMAGELIST, (int)API.FILE_FLAG.SHGFI_LARGEICON, LargeInt);
                API.SendMessage(listView2.Handle, LVM_SETIMAGELIST, (int)API.FILE_FLAG.SHGFI_LARGEICON, LargeInt);
    然后获取文件夹和文件的图标信息,并设置。你可以看看MSDN上WINDOWS SHELL编程的介绍
    //通过API获得目录信息
    API.SHFILEINFO sfi = new API.SHFILEINFO();
    API.SHGetFileInfoW(file, 0, ref sfi, (uint)Marshal.SizeOf(sfi), API.FILE_FLAG.SHGFI_DISPLAYNAME | API.FILE_FLAG.SHGFI_TYPENAME | API.FILE_FLAG.SHGFI_ICON);
      

  3.   

    我在网上看了一些代码,他是把图片显示在picturebox里,能不能拿到imagelist里面
     [DllImport("Shell32.dll")]
            static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, ref   SHFILEINFO psfi, uint cbFileInfo, uint uFlags);        struct SHFILEINFO
            {
                public IntPtr hIcon;
                public int iIcon;
                public uint dwAttributes;
                public char szDisplayName;
                public char szTypeName;
            }
            /// <summary>
            /// 从文件扩展名得到文件关联图标
            /// </summary>
            /// <param name="fileName">文件名或文件扩展名</param>
            /// <param name="smallIcon">是否是获取小图标,否则是大图标</param>
            /// <returns>图标</returns>
            static public Icon GetFileIcon(string fileName, bool smallIcon)
            {
                SHFILEINFO fi = new SHFILEINFO();
                Icon ic = null;
                //SHGFI_ICON + SHGFI_USEFILEATTRIBUTES + SmallIcon   
                int iTotal = (int)SHGetFileInfo(fileName, 100, ref fi, 0, (uint)(smallIcon ? 273 : 272));
                if (iTotal > 0)
                {
                    ic = Icon.FromHandle(fi.hIcon);
                }
                return ic;
            }        private void button1_Click(object sender, EventArgs e)
            {
                Graphics g = pictureBox1.CreateGraphics();
                g.Clear(pictureBox1.BackColor);
                g.DrawIcon(GetFileIcon(textBox1.Text, true), 0, 0);            g = pictureBox2.CreateGraphics();
                g.Clear(pictureBox2.BackColor);
                g.DrawIcon(GetFileIcon(textBox1.Text, false), 0, 0);
            }
      

  4.   

    你既然要做文件管理系统,肯定是用ListView来显示文件比较好吧。上面代码与设置到Listview的ImageList中在。API是自己包装的WIN32 API类,发送LVM_SETIMAGELIST消息设置API.SendMessage(listView1.Handle, LVM_SETIMAGELIST, (int)API.FILE_FLAG.SHGFI_SMALLICON, SmallInt);