C#获取文件超大图标256*256(转)
从Bing搜索得到,保存于此
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Diagnostics; namespace WpfApplication1
{
public class c_icon_of_path
{
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
private struct POINT
{
public int x;
public int y;
}
// Constants that we need in the function call private const int SHGFI_ICON = 0x100; private const int SHGFI_SMALLICON = 0x1; private const int SHGFI_LARGEICON = 0x0; private const int SHIL_JUMBO = 0x4;
private const int SHIL_EXTRALARGE = 0x2; // This structure will contain information about the file public struct SHFILEINFO
{ // Handle to the icon representing the file public IntPtr hIcon; // Index of the icon within the image list public int iIcon; // Various attributes of the file public uint dwAttributes; // Path to the file [MarshalAs(UnmanagedType.ByValTStr, SizeConst = )] public string szDisplayName; // File type [MarshalAs(UnmanagedType.ByValTStr, SizeConst = )] public string szTypeName; }; [System.Runtime.InteropServices.DllImport("Kernel32.dll")]
public static extern Boolean CloseHandle(IntPtr handle); private struct IMAGELISTDRAWPARAMS
{
public int cbSize;
public IntPtr himl;
public int i;
public IntPtr hdcDst;
public int x;
public int y;
public int cx;
public int cy;
public int xBitmap; // x offest from the upperleft of bitmap
public int yBitmap; // y offset from the upperleft of bitmap
public int rgbBk;
public int rgbFg;
public int fStyle;
public int dwRop;
public int fState;
public int Frame;
public int crEffect;
} [StructLayout(LayoutKind.Sequential)]
private struct IMAGEINFO
{
public IntPtr hbmImage;
public IntPtr hbmMask;
public int Unused1;
public int Unused2;
public RECT rcImage;
} #region Private ImageList COM Interop (XP)
[ComImportAttribute()]
[GuidAttribute("46EB5926-582E-4017-9FDF-E8998DAA0950")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
//helpstring("Image List"),
interface IImageList
{
[PreserveSig]
int Add(
IntPtr hbmImage,
IntPtr hbmMask,
ref int pi); [PreserveSig]
int ReplaceIcon(
int i,
IntPtr hicon,
ref int pi); [PreserveSig]
int SetOverlayImage(
int iImage,
int iOverlay); [PreserveSig]
int Replace(
int i,
IntPtr hbmImage,
IntPtr hbmMask); [PreserveSig]
int AddMasked(
IntPtr hbmImage,
int crMask,
ref int pi); [PreserveSig]
int Draw(
ref IMAGELISTDRAWPARAMS pimldp); [PreserveSig]
int Remove(
int i); [PreserveSig]
int GetIcon(
int i,
int flags,
ref IntPtr picon); [PreserveSig]
int GetImageInfo(
int i,
ref IMAGEINFO pImageInfo); [PreserveSig]
int Copy(
int iDst,
IImageList punkSrc,
int iSrc,
int uFlags); [PreserveSig]
int Merge(
int i1,
IImageList punk2,
int i2,
int dx,
int dy,
ref Guid riid,
ref IntPtr ppv); [PreserveSig]
int Clone(
ref Guid riid,
ref IntPtr ppv); [PreserveSig]
int GetImageRect(
int i,
ref RECT prc); [PreserveSig]
int GetIconSize(
ref int cx,
ref int cy); [PreserveSig]
int SetIconSize(
int cx,
int cy); [PreserveSig]
int GetImageCount(
ref int pi); [PreserveSig]
int SetImageCount(
int uNewCount); [PreserveSig]
int SetBkColor(
int clrBk,
ref int pclr); [PreserveSig]
int GetBkColor(
ref int pclr); [PreserveSig]
int BeginDrag(
int iTrack,
int dxHotspot,
int dyHotspot); [PreserveSig]
int EndDrag(); [PreserveSig]
int DragEnter(
IntPtr hwndLock,
int x,
int y); [PreserveSig]
int DragLeave(
IntPtr hwndLock); [PreserveSig]
int DragMove(
int x,
int y); [PreserveSig]
int SetDragCursorImage(
ref IImageList punk,
int iDrag,
int dxHotspot,
int dyHotspot); [PreserveSig]
int DragShowNolock(
int fShow); [PreserveSig]
int GetDragImage(
ref POINT ppt,
ref POINT pptHotspot,
ref Guid riid,
ref IntPtr ppv); [PreserveSig]
int GetItemFlags(
int i,
ref int dwFlags); [PreserveSig]
int GetOverlayImage(
int iOverlay,
ref int piIndex);
};
#endregion ///
/// SHGetImageList is not exported correctly in XP. See KB316931
/// http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316931
/// Apparently (and hopefully) ordinal 727 isn't going to change.
///
[DllImport("shell32.dll", EntryPoint = "#727")]
private extern static int SHGetImageList(
int iImageList,
ref Guid riid,
out IImageList ppv
); // The signature of SHGetFileInfo (located in Shell32.dll)
[DllImport("Shell32.dll")]
public static extern int SHGetFileInfo(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags); [DllImport("Shell32.dll")]
public static extern int SHGetFileInfo(IntPtr pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags); [DllImport("shell32.dll", SetLastError = true)]
static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, Int32 nFolder,
ref IntPtr ppidl); [DllImport("user32")]
public static extern int DestroyIcon(IntPtr hIcon); public struct pair
{
public System.Drawing.Icon icon { get; set; }
public IntPtr iconHandleToDestroy { set; get; } } public static int DestroyIcon2(IntPtr hIcon)
{
return DestroyIcon(hIcon);
} private static BitmapSource bitmap_source_of_icon(System.Drawing.Icon ic)
{
var ic2 = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(ic.Handle,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
ic2.Freeze();
return ((BitmapSource)ic2);
} //public static BitmapSource SystemIcon(bool small, ShellLib.ShellApi.CSIDL csidl)
//{ // IntPtr pidlTrash = IntPtr.Zero;
// int hr = SHGetSpecialFolderLocation(IntPtr.Zero, (int)csidl, ref pidlTrash);
// Debug.Assert(hr == 0); // SHFILEINFO shinfo = new SHFILEINFO(); // uint SHGFI_USEFILEATTRIBUTES = 0x000000010; // // Get a handle to the large icon
// uint flags;
// uint SHGFI_PIDL = 0x000000008;
// if (!small)
// {
// flags = SHGFI_PIDL | SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES;
// }
// else
// {
// flags = SHGFI_PIDL | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES;
// } // var res = SHGetFileInfo(pidlTrash, 0, ref shinfo, Marshal.SizeOf(shinfo), flags);
// Debug.Assert(res != 0); // var myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
// Marshal.FreeCoTaskMem(pidlTrash);
// var bs = bitmap_source_of_icon(myIcon);
// myIcon.Dispose();
// bs.Freeze(); // importantissimo se no fa memory leak
// DestroyIcon(shinfo.hIcon);
// CloseHandle(shinfo.hIcon);
// return bs; //} public static BitmapSource icon_of_path(string FileName, bool small, bool checkDisk, bool addOverlay)
{
SHFILEINFO shinfo = new SHFILEINFO(); uint SHGFI_USEFILEATTRIBUTES = 0x000000010;
uint SHGFI_LINKOVERLAY = 0x000008000; uint flags;
if (small)
{
flags = SHGFI_ICON | SHGFI_SMALLICON;
}
else
{
flags = SHGFI_ICON | SHGFI_LARGEICON;
}
if (!checkDisk)
flags |= SHGFI_USEFILEATTRIBUTES;
if (addOverlay)
flags |= SHGFI_LINKOVERLAY; var res = SHGetFileInfo(FileName, , ref shinfo, Marshal.SizeOf(shinfo), flags);
if (res == )
{
throw (new System.IO.FileNotFoundException());
} var myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon); var bs = bitmap_source_of_icon(myIcon);
myIcon.Dispose();
bs.Freeze(); // importantissimo se no fa memory leak
DestroyIcon(shinfo.hIcon);
CloseHandle(shinfo.hIcon);
return bs; } public static BitmapSource icon_of_path_large(string FileName, bool jumbo, bool checkDisk)
{ SHFILEINFO shinfo = new SHFILEINFO(); uint SHGFI_USEFILEATTRIBUTES = 0x000000010;
uint SHGFI_SYSICONINDEX = 0x4000; int FILE_ATTRIBUTE_NORMAL = 0x80; uint flags;
flags = SHGFI_SYSICONINDEX; if (!checkDisk) // This does not seem to work. If I try it, a folder icon is always returned.
flags |= SHGFI_USEFILEATTRIBUTES; var res = SHGetFileInfo(FileName, FILE_ATTRIBUTE_NORMAL, ref shinfo, Marshal.SizeOf(shinfo), flags);
if (res == )
{
throw (new System.IO.FileNotFoundException());
}
var iconIndex = shinfo.iIcon; // Get the System IImageList object from the Shell:
Guid iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950"); IImageList iml;
int size = jumbo ? SHIL_JUMBO : SHIL_EXTRALARGE;
var hres = SHGetImageList(size, ref iidImageList, out iml); // writes iml
//if (hres == 0)
//{
// throw (new System.Exception("Error SHGetImageList"));
//} IntPtr hIcon = IntPtr.Zero;
int ILD_TRANSPARENT = ;
hres = iml.GetIcon(iconIndex, ILD_TRANSPARENT, ref hIcon);
//if (hres == 0)
//{
// throw (new System.Exception("Error iml.GetIcon"));
//} var myIcon = System.Drawing.Icon.FromHandle(hIcon);
var bs = bitmap_source_of_icon(myIcon);
myIcon.Dispose();
bs.Freeze(); // very important to avoid memory leak
DestroyIcon(hIcon);
//CloseHandle(hIcon); return bs; }
}
}
C#获取文件超大图标256*256(转)的更多相关文章
- QFileInfo与QFileIconProvider(分别用于获取文件信息和获取文件的图标)
判断文件是否存在,获取文件名称,绝对路径,修改时间等等信息 fileInfo = Qt.QFileInfo(filename) fileIcon = Qt.QFileIconProvider() ic ...
- C++根据扩展名获取文件图标、类型
简述 在Windows系统中,根据扩展名来区分文件类型,比如:.txt(文本文件)..exe(可执行程序).*.zip(压缩文件),下面,我们来根据扩展名来获取对应的文件图标.类型. 简述 源码 源码 ...
- 在Vista或更高版本Windows系统中, 获取超大图标的办法
这几天写个小东西, 需要获取系统正在运行的程序图标, 一般来说32*32就足够了, 不过既然Win7能够支持超大图标(256*256), 咱们也需要与时俱进, 说不定什么时候遇到个变态客户就有这要求了 ...
- C# 获取文件图标
今天突然想到一个问题,如何去获取一个文件的关联图标呢?于是就上网搜索了一下.现总结如下: 首先明确问题:获取一个文件的关联图标或者是某个类型文件的显示图标. 在网上搜了一圈,发现方法还是比较多的,但是 ...
- Qt之根据扩展名获取文件图标、类型
简述 在C++根据扩展名获取文件图标.类型一节中我们分享了如何根据扩展名来获取对应的文件图标.类型,下面.我们在Qt中使用它. 简述 示例 效果 源码 更多参考 示例 如下,我们根据扩展名来获取对应的 ...
- Qt之QFileIconProvider(根据扩展名获取文件图标、类型)
简述 在Qt之QFileIconProvider一节中已经讲解关于如何获取文件图标与类型.但只仍针对本地已存在的文件,此节,我们主要运用前面分享的内容,讲述如何通过任意后缀或本地不存在的文件来获取相关 ...
- delphi 动态获取文件类型的图标
delphi 动态获取文件类型的图标.txt我不奢望什么,只希望你以后的女人一个不如一个.真怀念小时候啊,天热的时候我也可以像男人一样光膀子!在应用程序的编写中,组合框(ComboBox).列表框(L ...
- c++ 获取文件图标,类型名称,属性 SHGetFileInfo
SHGetFileInfo是一个相当实用的Windows API函数. // [MoreWindows工作笔记4] 获取文件图标,类型名称,属性 SHGetFileInfo #include < ...
- delphi 获取文件图标
{根据文件的名字得到此文件在系统中对应大小的图标large=true(64*64) false(32*32)}procedure GetFileIcon(TypeName: Widestring; I ...
随机推荐
- CM005-逆向分析过程(上篇)
前言 005,都说比较变态,很多人给放过去了,但是我还是决定上了它,既然变态就分两篇,上篇先实际说流程,到底应该怎么上它,下篇会告诉逆向分析的过程和方法 准备 [环境和工具] win7/xp虚拟机环境 ...
- 转 Git 常用命令大全
一. Git 常用命令速查 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch ...
- 条件GAN论文简单解读
条件GAN(Conditional Generative Adversarial Nets),原文地址为CGAN. Abstract 生成对抗网络(GAN)是最近提出的训练生成模型(g ...
- HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线
HyperLedger/Fabric SDK Docker Image 该项目在github上的地址是:https://github.com/aberic/fabric-sdk-container ( ...
- webstorm开发微信小程序代码提醒(webstorm开发工具)
使用了微信提供的开发工具是真心难用,卡顿厉害.中英文切写注释换相当不爽.还没办法多开窗口,相信大家也遇到过这种现象. 下边我们介绍下webstorm来开发微信小程序的一些配置: File---sett ...
- [2017BUAA软工助教]结对组队
请同学们把第一次结对编程双方的学号评论在本博客下,只要一位同学评论即可.例如: 14061195 + 14061183
- 冲刺Two之站立会议7
今天我们把软件的基本功能完成之后,又对所有的界面进行了统一规范化并进行了相应的优化.
- Eclipse,代码中有错误,项目中却不显示红叉
***修改eclipse 代码提示级别1.单个项目修改项目上右键-->properties-->java compiler-->building-->enable projec ...
- Varnish 4.0 实战
简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高.速度更快.管 ...
- ElasticSearch 2 (25) - 语言处理系列之同义词
ElasticSearch 2 (25) - 语言处理系列之同义词 摘要 词干提取有助于通过简化屈折词到它们词根的形式来扩展搜索的范围,而同义词是通过关联概念和想法来扩展搜索范围的.或许没有文档能与查 ...