C#中如何获取文件图标

本文给大家介绍如何去获取一个文件的关联图标呢?现总结如下:

  首先明确问题:获取一个文件的关联图标或者是某个类型文件的显示图标。

  在网上搜了一圈,发现方法还是比较多的,但是应用C#进行获取的方法不多。我选择一种用.Net库的方法。

 使用的类:

    System.Drawing.Icon ,位于System.Drawing 命名空间。

  具体方法:  

    System.Drawing.Icon 类中的静态方法:public static Icon ExtractAssociatedIcon(string filePath)

  此方法接收一个文件路径,返回一个 Icon 类型的对象。此对象既是指定文件的 Icon 图标对象。

  此 Icon 类提供了 Save 方法,可以将 Icon 文件写入流中,进而保存至硬盘文件。

  当然要在程序中显示也是可以的,Icon 类提供了 ToBitmap 方法,可以将 Icon 文件转换为 Bitmap。Bitmap 就可以在 PictureBox 中显示了。

  如果要根据后缀名来获取文件图标,那要怎么办呢?我想了一个比较笨的办法。看代码~

string fileName = "tmp." + houzhuiming;
    File.Create(fileName).Close();
    Image img = System.Drawing.Icon.ExtractAssociatedIcon(fileName).ToBitmap();
    File.Delete(fileName);

  如此,新建一个指定后缀名的文件,获取图标后直接删除,就能获得指定文件后缀名的图标了。嘻嘻~

下面给大家分享一段代码介绍C#获取文件关联图标

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using Microsoft.Win32;
namespace ifmdp.DeviceManager
{
class SystemIcon
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public 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;
}
[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 enum FileInfoFlags : uint
{
SHGFI_ICON = 0x000000100, // get icon
SHGFI_DISPLAYNAME = 0x000000200, // get display name
SHGFI_TYPENAME = 0x000000400, // get type name
SHGFI_ATTRIBUTES = 0x000000800, // get attributes
SHGFI_ICONLOCATION = 0x000001000, // get icon location
SHGFI_EXETYPE = 0x000002000, // return exe type
SHGFI_SYSICONINDEX = 0x000004000, // get system icon index
SHGFI_LINKOVERLAY = 0x000008000, // put a link overlay on icon
SHGFI_SELECTED = 0x000010000, // show icon in selected state
SHGFI_ATTR_SPECIFIED = 0x000020000, // get only specified attributes
SHGFI_LARGEICON = 0x000000000, // get large icon
SHGFI_SMALLICON = 0x000000001, // get small icon
SHGFI_OPENICON = 0x000000002, // get open icon
SHGFI_SHELLICONSIZE = 0x000000004, // get shell size icon
SHGFI_PIDL = 0x000000008, // pszPath is a pidl
SHGFI_USEFILEATTRIBUTES = 0x000000010, // use passed dwFileAttribute
SHGFI_ADDOVERLAYS = 0x000000020, // apply the appropriate overlays
SHGFI_OVERLAYINDEX = 0x000000040 // Get the index of the overlay
}
public enum FileAttributeFlags : uint
{
FILE_ATTRIBUTE_READONLY = 0x00000001,
FILE_ATTRIBUTE_HIDDEN = 0x00000002,
FILE_ATTRIBUTE_SYSTEM = 0x00000004,
FILE_ATTRIBUTE_DIRECTORY = 0x00000010,
FILE_ATTRIBUTE_ARCHIVE = 0x00000020,
FILE_ATTRIBUTE_DEVICE = 0x00000040,
FILE_ATTRIBUTE_NORMAL = 0x00000080,
FILE_ATTRIBUTE_TEMPORARY = 0x00000100,
FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200,
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400,
FILE_ATTRIBUTE_COMPRESSED = 0x00000800,
FILE_ATTRIBUTE_OFFLINE = 0x00001000,
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000,
FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
}
#endregion
/// <summary>
/// 获取文件类型的关联图标
/// </summary>
/// <param name="fileName">文件类型的扩展名或文件的绝对路径</param>
/// <param name="isLargeIcon">是否返回大图标</param>
/// <returns>获取到的图标</returns>
public static Icon GetIcon(string fileName, bool isLargeIcon)
{
SHFILEINFO shfi = new SHFILEINFO();
IntPtr hI;
if (isLargeIcon)
hI = SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), (uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES | (uint)FileInfoFlags.SHGFI_LARGEICON);
else
hI = SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), (uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES | (uint)FileInfoFlags.SHGFI_SMALLICON);
Icon icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
DestroyIcon(shfi.hIcon); //释放资源
return icon;
}
/// <summary>
/// 获取文件夹图标
/// </summary>
/// <returns>图标</returns>
public static Icon GetDirectoryIcon(bool isLargeIcon)
{
SHFILEINFO _SHFILEINFO = new SHFILEINFO();
IntPtr _IconIntPtr;
if (isLargeIcon)
{
_IconIntPtr = SHGetFileInfo(@"", 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), ((uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_LARGEICON));
}
else
{
_IconIntPtr = SHGetFileInfo(@"", 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), ((uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_SMALLICON));
}
if (_IconIntPtr.Equals(IntPtr.Zero)) return null;
Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon);
return _Icon;
}
}
}
(0)

相关推荐

  • 用 C# 编写一个停放在任务栏上的图标程序

    用 C# 编写一个停放在任务栏上的图标程序  作者: 蔡世友 类别: C#/VB 日期: 2002-1-30 10:21:46   01-12-6 上午 10:53:11 -------------------------------------------------------------------------------- 引 言  C#语言是微软公司针对.Net平台才推出来的一门新语言,作为.Net平台的第一语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果.其是当前第一个完全

  • c# 托盘双击不触发单击事件的实现方法

    我想到了如下方法,即创建一个Timer控件(以下名为timer_singleclick),一旦单击发生,就自动启动Timer的Tick事件(timer_singleclick_Tick(object sender, EventArgs e)),一定时间后,若没有第二次点击发生,则执行单击事件(Operate_DoubleClick()),若在这段时间有双击事件(notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e))发生,则停止

  • C#实现带消息数的App图标

    上次写了一篇博文,但是每次更新图标时,桌面会闪烁(刷新)http://www.jb51.net/article/73350.htm,有博友说人家的图标都不会刷新,还能动画.我想了一下,如果要达到这个效果,可以用Form来实现,就是在Form中嵌入一个图片,然后用一个label来动态显示消息数,关键是将Form的边框隐藏,背景设为透明即可.如果要有旋转或者缩放动画,都可以用C#来实现. using System; using System.Collections.Generic; using Sy

  • C#实现位图转换成图标的方法

    本文实例讲述了C#实现位图转换成图标的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication2 { public par

  • C#禁用双击窗体图标关闭窗体的方法

    本文实例讲述了C#禁用双击窗体图标关闭窗体的方法.分享给大家供大家参考.具体实现方法如下: [DllImport("user32.dll")] private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); protected override void WndProc(ref Message m) { if (m.Msg == 0x112) { if (m.WParam.ToInt32() == 61539

  • C#程序最小化到托盘图标操作步骤与实现代码

    复制代码 代码如下: // this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged); //上面一行是主窗体InitializeComponent()方法中需要添加的引用 private void Form1_SizeChanged(object sender, EventArgs e) { if (this.WindowState==FormWindowState.Minimized) { this.Hide();

  • C#怎样才能实现窗体最小化到托盘呢?

    private void Form1_Resize(object sender, System.EventArgs e) {     if (this.WindowState == FormWindowState.Minimized) {         this.Visible = false;         this.notifyIcon1.Visible = true;     } } private void notifyIcon1_Click(object sender, Syste

  • C# WinForm窗口最小化到系统托盘

    1.设置WinForm窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标. 3.添加窗体最小化事件(首先需要添加事件引用): 复制代码 代码如下: this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged); //上面一行是主窗体InitializeComponent()方法中需要添加的引用 private voi

  • C#实现托盘程序并禁止多个应用实例运行的方法

    本文实例讲述了C#实现托盘程序并禁止多个应用实例运行的方法.分享给大家供大家参考,具体如下: 托盘程序的制作: 1.把NotifyIcon控件拉一个到窗体上,并设置NotifyIcon的Icon(很重要!否则运行后看不到效果) 2.窗体关闭时,将程序最小化到系统托盘上 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //MessageBox.Show("程序将最小化到系统托盘区"); e.C

  • C#实现系统托盘通知的方法

    本文实例讲述了C#实现系统托盘通知的方法.分享给大家供大家参考.具体实现方法如下: namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { this.Activate(); } private void Form1_Resiz

  • C#实现闪动托盘图标效果的方法

    本文实例讲述了C#实现闪动托盘图标效果的方法.分享给大家供大家参考,具体如下: 在用户正在登录QQ或者使用Firemail邮件系统自动收取邮件的时候,托盘图标会闪动提示用户正在运行的任务. 闪动图标可以使用定时切换托盘图标的方式实现,托盘图标可以从ImageList控件中获取.在ImageList控件里面添加三个icon,第一个icon表示窗体启动以后的托盘图标.第二个和第三个图标分别表示当特定的任务发生的时候,定时切换的图标. (1)设置托盘的图标可以从ImageList控件中的Image对象

  • C#实现WinForm禁止最大化、最小化、双击标题栏、双击图标等操作的方法

    本文实例讲述了C#实现WinForm禁止最大化.最小化.双击标题栏.双击图标等操作的方法.分享给大家供大家参考.具体实现方法如下: protected override void WndProc(ref Message m) { if (m.Msg==0x112) { switch ((int) m.WParam) { //禁止双击标题栏关闭窗体 case 0xF063: case 0xF093: m.WParam = IntPtr.Zero; break; //禁止拖拽标题栏还原窗体 case

  • C#实现用户自定义控件中嵌入自己的图标

    本文实例讲述了C#实现用户自定义控件中嵌入自己的图标.分享给大家供大家参考,具体如下: 下面给出一下具体的步骤. 1. 新建一个用户控件 2. 向资源文件是添加一张图片,图片格式可以是bm,ico 大小最好是 16 * 16 啦! 3. 选中用户控件图标,单击"右键>属性"把 "生成操作 的属性值改为:嵌入的资源(Action Resource) 4. 第四步: [ToolboxBitmap(typeof(CutPitureNew_WPF), "CutPitu

随机推荐