C#获取应用程序图标

这篇博客讨论了如何在C#中获取应用程序图标,包括使用ExtractIconEX和SHGetFileInfo API函数,以及.NET Framework中的解决方案。开发者们分享了代码示例和遇到的问题,如从shell32.dll提取图标以及在C#中调用API的技巧。

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文件取图标不正常。返回的是不识别图标。不知道为什么。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值