C#中如何获取文件图标???

javaduke 2002-01-26 09:12:22
本人很菜,最好提供一些代码写法。一定重谢。
...全文
812 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
javaduke 2002-01-31
  • 打赏
  • 举报
回复
我使用上面的SHGetFileInfo调用图标时候正常操作。但是往往在添加一个文件后*.html文件取图标不正常。返回的是不识别图标。不知道为什么。
ulit 2002-01-30
  • 打赏
  • 举报
回复
我用WINCV查的时候,在System.Drawing.Icon 有一个ICON类呀,这个类用来干嘛的?
zhaixd 2002-01-30
  • 打赏
  • 举报
回复
还有,我想知道不用Api函数能实现吗?
zhaixd 2002-01-30
  • 打赏
  • 举报
回复
应该可以不调用icon.Dispose,不是有垃圾收集器的吗

回 : 回复人: ulit(如歌) (2002-1-29 20:11:09) 得0分
CF.Win32Api 这一组件在哪?能不能public出来呀?拜托!!!
我很想知道!!

CF是CForce自己创建的一个组件,大概是用来引用Api函数的
zhaixd 2002-01-30
  • 打赏
  • 举报
回复
ICON类就是表示一个图标,你说图标是用来干什么的呢?呵呵
javaduke 2002-01-30
  • 打赏
  • 举报
回复
函数定义如下:
[StructLayout(LayoutKind.Sequential)]
public struct SHFileInfo
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttribs;
[MarshalAs(UnmanagedType.LPStr, SizeConst=260)]
public string pszDisplayName;
[MarshalAs(UnmanagedType.LPStr, SizeConst=80)]
public string pszTypeName;
};
public enum SHGFI{SmallIcon = 0x00000001,LargeIcon = 0x00000000,ICON=0x000000100,DISPLAYNAME=0x000000200,TYPENAME=0x000000400,SysIconIndex=0x00004000,UseFileAttributes = 0x00000010}
[DllImport("shell32")]
static extern IntPtr SHGetFileInfo(string pszPath,uint dwAttribs,out SHFileInfo lpfi,int cb,SHGFI flags);

通过下面得到ICON
SHFileInfo fileiconinfo=new SHFileInfo();
SHGetFileInfo(filename,0,out fileiconinfo,Marshal.SizeOf(fileiconinfo),SHGFI.ICON|SHGFI.SmallIcon);

Icon thefileicon=Icon.FromHandle(fileiconinfo.hIcon);
绝对可以,已经试验成功。不过Icon用过后是否应该调用icon.dispose(),我尚不大清楚。
javaduke 2002-01-29
  • 打赏
  • 举报
回复
在C#中调用上述两个方法的代码是什么,我总搞不定。marshal如何用?
ulit 2002-01-29
  • 打赏
  • 举报
回复
CF.Win32Api 这一组件在哪?能不能public出来呀?拜托!!!
我很想知道!!
CForce 2002-01-29
  • 打赏
  • 举报
回复
还是自己解决了,CF.Win32Api是我刚写好的一个组件,把它引入后可以直接调用api,当然你也可以自己声明。现在在试用(alpha),很快就发给大家试用了(bate)。
下面是我写的代码,调用成功。(哎,又省300分了)

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
int hicon=CF.Win32Api.ExtractIcon((int)this.Handle,"c:\\windows\\System32\\shell32.dll",0);
int hdc=(int)this.CreateGraphics().GetHdc();
CF.Win32Api.DrawIcon(hdc,10,10,hicon);
}
zhaixd 2002-01-28
  • 打赏
  • 举报
回复
1.用SHGetFileInfo SDK函数
:: OnDraw(CDC *pDC)
{
if(:: SHGetFileInfo( _T("c:\\windows\\notepad.exe"),0,&stFileInfo,
sizeof(stFileInfo),SHGFI_ICON) )
{ pDC->DrawIcon(10,10,stFileInfo.hIcon);
}
}
2.用ExtractIcon SDK函数
OnDraw(CDC *pDC)
{
HICON hIcon = ::ExtractIcon(AFXGetInstanceHandle(),
_T("c:\\windows\\notepad.exe"),0);
if(hIcon && hIcon!=(HICON)-1)
pDC -> DrawIcon(10,10,hIcon);
}
这两种方法都能提取notepad.exe的图标。
不过,你大概是想知道.Net FrameWork中有什么办法
我查了相当长的时间,试了很多方法,都不成功
有一点很奇怪,.Net的FileInfo类与DirectoryInfo类均没有与图标相关的属性
Jneu 2002-01-26
  • 打赏
  • 举报
回复
使用ExtractIconEX API函数从文件中提取图标,并返回图标句柄,然后利用该句柄,使用DrawIcon函数将图标绘制到目标设备中。最后清除句柄以释放系统资源。
CForce 2002-01-26
  • 打赏
  • 举报
回复
天啊!怎么这么巧啊,我正想问这个问题!
我想编个小软件把xp的shell32.dll的图解出来,太漂亮了!(不要叫我用现成的软件)

Jneu(沧海桑田):
就是调用不了啊,不知道为什么,ExtractIconEX,你试试,成功了贴出来啊!谢谢~~

还有mciSendCommand(),我没办法调用成功,如果谁成功调用这两函数,我也给300分!
加起来600分啊~~!
javaduke 2002-01-26
  • 打赏
  • 举报
回复
可是我想获得同IE浏览那样,同操作系统一致的文件关联图标

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧