C#做的文件管理系统如何关联系统图标? 我自己做的文件管理系统,能够扫出电脑里文件和文件夹。有没有办法把他们的图标和系统图标关联起来?就像windows那样。还有那些文件怎么直接调用系统程序运行啊?我是菜鸟,谢谢各位大哥大姐... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 到注册表root下找对应扩展名的项 把系统的文件图标设置到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); 我在网上看了一些代码,他是把图片显示在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); } 你既然要做文件管理系统,肯定是用ListView来显示文件比较好吧。上面代码与设置到Listview的ImageList中在。API是自己包装的WIN32 API类,发送LVM_SETIMAGELIST消息设置API.SendMessage(listView1.Handle, LVM_SETIMAGELIST, (int)API.FILE_FLAG.SHGFI_SMALLICON, SmallInt); chart 控件 曲线点击事件 C#中,从客户端,向服务器端发送请求,服务器端,收到请求,处请理求,如何将处理后的结果,在返回给客户端? 关于C#操作EXCEL的问题 access数据库,实现此功能的,sql语句如果写? 请问C#的数组问题 在winform中如何通过控件名获取此控件?(急,在线等) xslt和EXCEL的问题! DataGridView 怎么判断一个枚举,数组或者集合中的值是否都相等? c#窗体 求NHibernate by SharPM64 1.3.1的模板 请教c#委托的问题!!
//获得系统的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);
[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);
}