以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  如何获取 文件的默认图标?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=78638)

--  作者:qianqian1530
--  发布时间:2015/12/14 10:40:00
--  如何获取 文件的默认图标?
我想用 ListView 做个 路径加载,

怎么才能获取  文件默认的 图标呢?

--  作者:大红袍
--  发布时间:2015/12/14 10:53:00
--  

可以看看

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=56054&skin=0

 


--  作者:qianqian1530
--  发布时间:2015/12/14 13:04:00
--  
嗯,  文件的可以 提取了, 但是 有办法提起文件夹的 的吗?  比如我的电脑, 回收站 什么的?
--  作者:大红袍
--  发布时间:2015/12/14 14:48:00
--  

mark 提取icon

 

全局代码

 

Public Class GetSysicon
 \'\'\' <summary>
 \'\'\' 获得指定文件图标句柄
 \'\'\' </summary>
 \'\'\' <param name="path">指定的文件名</param>
 \'\'\' <param name="fileattribute">文件属性</param>
 \'\'\' <param name="?">返回的文件信息</param>
 \'\'\' <param name="SizeFileInfo">sfinfo的比特值</param>
 \'\'\' <param name="flag">指明要返回的文件信息标识符</param>
 \'\'\' <returns>文件的图标句柄</returns>
 <DllImport("shell32.dll", EntryPoint := "SHGetFileInfo")> _
 Public Shared Function SHGetFileInfo(path As String, fileattribute As UInteger, ByRef sfinfo As SHFILEINFO, SizeFileInfo As UInteger, flag As UInteger) As IntPtr
 End Function

 \'\'\' <summary>
 \'\'\' 图标结构
 \'\'\' </summary>
 \'自定义类型
 <StructLayout(LayoutKind.Sequential)> _
 Public Structure SHFILEINFO
  Public hIcon As IntPtr
  \'文件的图标句柄
  Public iIcon As IntPtr
  \'图标的系统索引号
  Public aattributes As UInteger
  \'文件的属性值
  \'MarshalAs只是如何在托管代码和非托管代码间传送数据
  <MarshalAs(UnmanagedType.ByValTStr, SizeConst := 260)> _
  Public displayname As String
  \'文件的显示名
  <MarshalAs(UnmanagedType.ByValTStr, SizeConst := 80)> _
  Public typename As String
  \'文件的类型
 End Structure

 \'\'\' <summary>
 \'\'\' 清除图标
 \'\'\' </summary>
 \'\'\' <param name="hIcon">图标句柄</param>
 \'\'\' <returns>返回非零表示成功,零表示失败</returns>
 <DllImport("user32.dll", EntryPoint := "DestroyIcon")> _
 Public Shared Function DestroyIcon(hIcon As IntPtr) As Integer
 End Function

 \'\'\' <summary>
 \'\'\' 获取指定路径的系统图标
 \'\'\' </summary>
 \'\'\' <param name="path">路径</param>
 \'\'\' <param name="imglist">Imagelist对象保存图标</param>
 \'\'\' <param name="flag">表示是否为获取文件夹图标,true为获取文件夹图标,false为获取文件图标</param>
 Public Shared Function GetSysIcon(path__1 As String, flag As Boolean) As Icon
  Dim shfi As New SHFILEINFO()
  If flag Then
   Dim dir As New IO.DirectoryInfo(path__1)
   If dir.Name = "RECYCLER" OrElse dir.Name = "RECYCLED" OrElse dir.Name = "Recycled" OrElse dir.Name = "System Volume Information" Then
    \'windows系统文件夹
   Else
    \'Marshal.SizeOf返回对象的非托管大小
    SHGetFileInfo(path__1, CUInt(&H80), shfi, CUInt(Marshal.SizeOf(shfi)), CUInt(&H100 Or &H400))
    \'取得icon和typename
    dim ico = DirectCast(Icon.FromHandle(shfi.hIcon).Clone(), Icon)
    DestroyIcon(shfi.hIcon)
return ico
   End If
  Else
   Dim file As New FileInfo(path__1)
   Dim exten As String = io.Path.GetExtension(path__1).Substring(1, io.Path.GetExtension(path__1).Length - 1).ToLower()
   \'获取路径文件的扩展名,并去掉.
   If exten = "sys" OrElse exten = "ini" OrElse exten = "bin" OrElse exten = "log" OrElse exten = "com" OrElse exten = "bat" OrElse exten = "db" Then
   Else
    SHGetFileInfo(path__1, CUInt(&H80), shfi, CUInt(Marshal.SizeOf(shfi)), CUInt(&H100 Or &H400))
    dim ico = DirectCast(Icon.FromHandle(shfi.hIcon).Clone(), Icon)
    DestroyIcon(shfi.hIcon)
return ico
   End If
  End If
 End Function
End Class

 

调用代码

 

Dim icon = GetSysicon.GetSysIcon( Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), True)

\'Dim fileStream As new System.IO.FileStream("d:\\test2.ico", System.IO.FileMode.Create)
\'icon.Save(fileStream)
\'fileStream.Close()

 

https://msdn.microsoft.com/zh-cn/library/system.environment.specialfolder.aspx