1 楼Jneu(沧海桑田)回复于 2002-01-26 10:16:37 得分 0 使用ExtractIconEX API函数从文件中提取图标,并返回图标句柄,然后利用该句柄,使用DrawIcon函数将图标绘制到目标设备中。最后清除句柄以释放系统资源。
Top
2 楼javaduke()回复于 2002-01-26 15:37:33 得分 0 可是我想获得同IE浏览那样,同操作系统一致的文件关联图标
Top
3 楼CForce()回复于 2002-01-26 19:41:55 得分 0 天啊!怎么这么巧啊,我正想问这个问题!
我想编个小软件把xp的shell32.dll的图解出来,太漂亮了!(不要叫我用现成的软件)
Jneu(沧海桑田):
就是调用不了啊,不知道为什么,ExtractIconEX,你试试,成功了贴出来啊!谢谢~~
还有mciSendCommand(),我没办法调用成功,如果谁成功调用这两函数,我也给300分!
加起来600分啊~~!
Top
4 楼zhaixd()回复于 2002-01-28 08:57:59 得分 0 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类均没有与图标相关的属性
Top
5 楼javaduke()回复于 2002-01-29 09:25:43 得分 0 在C#中调用上述两个方法的代码是什么,我总搞不定。marshal如何用?
Top
6 楼CForce()回复于 2002-01-29 17:43:32 得分 0 还是自己解决了,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);
}
Top
7 楼ulit(如歌)回复于 2002-01-29 20:11:08 得分 0 CF.Win32Api 这一组件在哪?能不能public出来呀?拜托!!!
我很想知道!!
Top
8 楼javaduke()回复于 2002-01-30 07:20:21 得分 0 函数定义如下:
[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(),我尚不大清楚。
Top
9 楼ulit(如歌)回复于 2002-01-30 10:55:10 得分 0 我用WINCV查的时候,在System.Drawing.Icon 有一个ICON类呀,这个类用来干嘛的?
Top
10 楼zhaixd()回复于 2002-01-30 21:51:07 得分 0 ICON类就是表示一个图标,你说图标是用来干什么的呢?呵呵
Top
11 楼zhaixd()回复于 2002-01-30 21:54:18 得分 0 应该可以不调用icon.Dispose,不是有垃圾收集器的吗
回 : 回复人: ulit(如歌) (2002-1-29 20:11:09) 得0分
CF.Win32Api 这一组件在哪?能不能public出来呀?拜托!!!
我很想知道!!
CF是CForce自己创建的一个组件,大概是用来引用Api函数的
Top
12 楼zhaixd()回复于 2002-01-30 21:56:14 得分 0 还有,我想知道不用Api函数能实现吗?
Top
13 楼javaduke()回复于 2002-01-31 15:32:52 得分 0 我使用上面的SHGetFileInfo调用图标时候正常操作。但是往往在添加一个文件后*.html文件取图标不正常。返回的是不识别图标。不知道为什么。
这篇博客讨论了如何在C#中获取应用程序图标,包括使用ExtractIconEX和SHGetFileInfo API函数,以及.NET Framework中的解决方案。开发者们分享了代码示例和遇到的问题,如从shell32.dll提取图标以及在C#中调用API的技巧。

384

被折叠的 条评论
为什么被折叠?



