`
zu14
  • 浏览: 459672 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

C#获取文件(磁盘驱动器)的关联图标(使用API SHGetFileInfo)

阅读更多

这是一个C#调用系统API SHGetFileInfo 的一个演示例子,也是给一位网友的答复,先看效果图:

SHGetFileInfo 这个API, 可以获取指定对象的非常详细的相关信息,具体的内容,大家可以MSDN上关于此API的说明。

这个获取关联图标,可以获取磁盘分区的图标,可以获取某个特定类型的文件的图标,也可以获取某个指定文件的图标,下面给出实现的全部代码:

<script type="text/javascript"><!-- google_ad_client = "pub-5834986413902221"; /* 728x90 */ google_ad_slot = "1368486102"; google_ad_width = 728; google_ad_height = 90; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
/// <summary>
/// 保存文件信息的结构体
/// </summary>
/// 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct SHFILEINFO
{
    public IntPtr hIcon;
    public int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
}

class NativeMethods
{

    [DllImport("Shell32.dll", EntryPoint = "SHGetFileInfo", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);

    [DllImport("User32.dll", EntryPoint = "DestroyIcon")]
    public static extern int DestroyIcon(IntPtr hIcon);

    #region API 参数的常量定义

    public const uint SHGFI_ICON = 0x100;
    public const uint SHGFI_LARGEICON = 0x0; //大图标 32×32
    public const uint SHGFI_SMALLICON = 0x1; //小图标 16×16
    public const uint SHGFI_USEFILEATTRIBUTES = 0x10;

    #endregion

}
/// <summary>
/// 获取文件类型的关联图标
/// </summary>
/// <param name="fileName">文件类型的扩展名或文件的绝对路径</param>
/// <param name="isLargeIcon">是否返回大图标</param>
/// <returns>获取到的图标</returns>
static Icon GetIcon(string fileName, bool isLargeIcon)
{
    SHFILEINFO shfi = new SHFILEINFO();
    IntPtr hI;

    if (isLargeIcon)
        hI = NativeMethods.SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), NativeMethods.SHGFI_ICON | NativeMethods.SHGFI_USEFILEATTRIBUTES | NativeMethods.SHGFI_LARGEICON);
    else
        hI = NativeMethods.SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), NativeMethods.SHGFI_ICON | NativeMethods.SHGFI_USEFILEATTRIBUTES | NativeMethods.SHGFI_SMALLICON);

    Icon icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;

    NativeMethods.DestroyIcon(shfi.hIcon); //释放资源
    return icon;
}

private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    Help.ShowHelp(this, "http://www.zu14.cn");
}

private void btnGetIcon_Click(object sender, EventArgs e)
{
    using (Graphics g = this.pbSmallIcon.CreateGraphics())
    {
        g.Clear(this.pbSmallIcon.BackColor); //清除picturebox的背景色,为了画透明图标

        g.DrawIcon(GetIcon(this.tbFileExt.Text, false), 1, 1); //绘制小图标
    }

    using (Graphics g = this.pbLargeIcon.CreateGraphics())
    {
        g.Clear(this.pbLargeIcon.BackColor); //清除picturebox的背景色,为了画透明图标

        g.DrawIcon(GetIcon(this.tbFileExt.Text, true), 1, 1); //绘制小图标
    }
}
分享到:
评论

相关推荐

    (c#)使用SHGetFileInfo获取文件或文件夹图标,显示在listview中

    本示例探讨的是如何使用`SHGetFileInfo`函数,一个Windows API调用,来获取这些图标,并将它们显示在ListView控件中。这个功能在开发文件管理器或者其他需要显示系统图标的应用程序时非常有用。 `SHGetFileInfo`是...

    获取文件关联图标的C#源码

    在给定的“获取文件关联图标的C#源码”示例中,开发者使用了Windows API中的`SHGetFileInfo()`函数,这是一个非常关键的系统调用,用于获取文件的相关信息,包括其关联的图标。下面我们将详细讨论这个知识点。 1. *...

    C#获取文件图标程序

    在C#编程语言中,我们可以通过一定的API调用来获取文件的图标。下面将详细讲解如何在C#中实现这一功能。 首先,我们需要理解Windows API中的Shell32库,它提供了用于与Windows壳层交互的接口,其中包括获取文件图标...

    C#写的获取当前文件ICO图标的程序

    本文将深入探讨如何使用C#来获取一个文件的ICO图标,这是一个常见的需求,特别是在创建自定义文件管理器或者需要显示文件图标的应用程序时。 ICO图标是Windows操作系统中用于表示文件和应用程序的小型图像格式,它...

    C#获取系统ICON图标示范

    在本文中,我们将深入探讨如何使用C#编程语言获取Windows操作系统的图标,特别是文件夹、不同类型的文件、程序文件以及带有特定图标的文件夹(如收藏夹)的图标。我们将介绍四种不同的方法,并且每种方法都有详细的...

    获取关联文件图标和应用程序图标

    1. 使用系统API:在Windows操作系统中,可以使用Shell32库中的`SHGetFileInfo`函数来获取文件的图标。该函数接受文件路径作为参数,返回包含文件信息的结构体,其中就包含了图标信息。 2. 使用.NET Framework:在C#...

    mfc获取文件的图标

    总结来说,MFC获取文件图标的关键在于使用`SHGetFileInfo`函数,它能从Windows系统中获取与文件关联的图标。对于MFC开发者,尤其是新手,了解并实践这个过程是提升技能的重要步骤。通过这样的程序,不仅可以学习到...

    获取文件关联的图标源

    然后,你可以使用注册表编辑器(如RegEdit)或编写注册表脚本来修改与文件扩展名关联的注册表项,添加或替换图标路径。 总结,获取文件关联的图标源涉及对Windows操作系统内部机制的理解,包括注册表、Shell32库和...

    C#获取系统图标

    - 使用`SHGetFileInfo`获取文件图标时,确保文件路径有效。 - 导出图标时,图标名称中的数字与图标索引之间的关系需特别注意,通常图标名称中的数字减1即为对应的索引值。 #### 五、扩展阅读 - 对于更复杂的图标...

    【MFC】获取文件的ICO图标(48*48,32*32)

    - Windows API通常会返回文件的32x32图标,如果需要48x48的图标,可以使用`SHGFI_LARGEICON`标志获取大图标,或者使用`SHGFI_SMALLICON`获取小图标。 - 如果需要特定尺寸的图标,可能需要使用其他方法,如加载图标...

    易语言取任意文件的关联图标模块例程源码,易语言取任意文件的关

    在易语言中,我们可以利用其提供的API函数和模块来实现特定的功能,比如获取文件的关联图标。"取任意文件的关联图标模块源码"就是一个易语言编写的模块,它实现了读取并显示Windows操作系统中任何文件关联图标的逻辑...

    MFC通过文件类型名获取文件图标列表

    "MFC通过文件类型名获取文件图标列表"这个主题就是关于如何在不实际拥有文件的情况下,仅凭文件的扩展名来获取该类型的文件图标。 文件图标在用户界面中起着重要的作用,它们可以帮助用户快速识别和理解文件的类型...

    c#中获得文件的ICO图标

    在Windows操作系统中,每个可执行文件、DLL或驱动程序都可以包含一个或多个ICO图标,代表其在系统资源管理器中的视觉标识。 在C#中获取文件的ICO图标,主要涉及到以下几个关键知识点: 1. **Shell32库**:Windows...

    qt获取文件—超大图标

    在Windows API中,获取文件图标可以使用`SHGetFileInfo`或`ExtractIcon`等函数。例如,`SHGetFileInfo`可以获取文件的各种信息,包括图标,而`ExtractIcon`则直接从可执行文件或DLL中提取图标。在Qt中,我们可以使用...

    C#中如何获取文件图标

    在C#编程中,获取文件图标是一项常见的任务,这通常涉及到桌面应用程序的用户界面设计,尤其是在展示文件系统中的文件时。以下是如何在C#中获取文件图标及其相关知识点的详细说明: 1. **System.Drawing.Icon类**:...

    获取文件图标(C#源码)

    保存图标时,确保使用`.Save()`方法将图标保存为`.ico`格式,这是Windows支持的图标文件格式,可以包含多个不同尺寸和颜色深度的图标,从而在不同的场景下保持颜色不失真。 总结一下,获取和保存C#中文件图标的关键...

    易语言API取文件图标信息源码

    易语言API取文件图标信息源码是一个关于如何在易语言编程环境中使用API函数来获取文件图标信息的示例代码。易语言是一款中国本土开发的、面向中文用户的编程语言,它的设计目标是让编程更加简单、直观。 在Windows...

    C# 直接浏览OFFICE 文件 抠取所有文件的Icon图标 源码

    在这种情况下,可以使用`SHGetFileInfo` API函数,它可以从Shell获取文件的图标信息,包括大图标、小图标和文件的其他属性。 实现这一功能的关键步骤如下: 1. 引用必要的库:如`System.Drawing`和`System.Runtime....

Global site tag (gtag.js) - Google Analytics