原文:封装:Windows系统文件图标

用途:用于获取文件系统默认图标


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. namespace HebianGu.ComLibModule.API
  9. {
  10. /// <summary> 获取文件关联图标 </summary>
  11. public partial class IconHelper
  12. {
  13. /// <summary> 返回系统设置的图标 </summary>
  14. /// <param name="pszPath">文件路径 如果为"" 返回文件夹的</param>
  15. /// <param name="dwFileAttributes">0</param>
  16. /// <param name="psfi">结构体</param>
  17. /// <param name="cbSizeFileInfo">结构体大小</param>
  18. /// <param name="uFlags">枚举类型</param>
  19. /// <returns>-1失败</returns>
  20. [DllImport("shell32.dll")]
  21. public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
  22. /// <summary> 获取文件图标 </summary>
  23. public Icon GetFileIcon(string p_Path)
  24. {
  25. SHFILEINFO _SHFILEINFO = new SHFILEINFO();
  26. IntPtr _IconIntPtr = SHGetFileInfo(p_Path, 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), (uint)(SHGFI.SHGFI_ICON | SHGFI.SHGFI_LARGEICON | SHGFI.SHGFI_USEFILEATTRIBUTES));
  27. if (_IconIntPtr.Equals(IntPtr.Zero)) return null;
  28. Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon);
  29. return _Icon;
  30. }
  31. /// <summary> 获取文件夹图标 </summary>
  32. public Icon GetDirectoryIcon()
  33. {
  34. SHFILEINFO _SHFILEINFO = new SHFILEINFO();
  35. IntPtr _IconIntPtr = SHGetFileInfo(@"", 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), (uint)(SHGFI.SHGFI_ICON | SHGFI.SHGFI_LARGEICON));
  36. if (_IconIntPtr.Equals(IntPtr.Zero)) return null;
  37. Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon);
  38. return _Icon;
  39. }
  40. /// <summary> 获取系统图标 </summary>
  41. public Icon GetSystemInfoIcon(string p_Path)
  42. {
  43. if (Path.HasExtension(p_Path))
  44. {
  45. try
  46. {
  47. return Icon.ExtractAssociatedIcon(p_Path);
  48. }
  49. catch
  50. {
  51. return null;
  52. }
  53. }
  54. else
  55. {
  56. return this.GetDirectoryIcon();
  57. }
  58. }
  59. }
  60. partial class IconHelper
  61. {
  62. #region - Start 单例模式 -
  63. /// <summary> 单例模式 </summary>
  64. private static IconHelper t = null;
  65. /// <summary> 多线程锁 </summary>
  66. private static object localLock = new object();
  67. /// <summary> 创建指定对象的单例实例 </summary>
  68. public static IconHelper Instance
  69. {
  70. get
  71. {
  72. if (t == null)
  73. {
  74. lock (localLock)
  75. {
  76. if (t == null)
  77. return t = new IconHelper();
  78. }
  79. }
  80. return t;
  81. }
  82. }
  83. /// <summary> 禁止外部实例 </summary>
  84. private IconHelper()
  85. {
  86. }
  87. #endregion - 单例模式 End -
  88. }
  89. [StructLayout(LayoutKind.Sequential)]
  90. public struct SHFILEINFO
  91. {
  92. public IntPtr hIcon;
  93. public IntPtr iIcon;
  94. public uint dwAttributes;
  95. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
  96. public string szDisplayName;
  97. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
  98. public string szTypeName;
  99. }
  100. public enum SHGFI
  101. {
  102. SHGFI_ICON = 0x100,
  103. SHGFI_LARGEICON = 0x0,
  104. SHGFI_USEFILEATTRIBUTES = 0x10
  105. }
  106. }

应用示例:


  1. /// <summary> 图片路径 </summary>
  2. public Icon ImagePath
  3. {
  4. get { return IconHelper.Instance.GetSystemInfoIcon(FilePath); }
  5. }

封装:Windows系统文件图标的更多相关文章

  1. SOUI界面库 添加 windows系统文件图标皮肤

    最近在学习soui界面库.其中有用到SListCtrl这个控件来现在文件信息.控件用法基本上和mfc 的CListCtrl差不多.也支持图标显示.但是图标是要自己加入图标图片的.这个就有点不好弄.于是 ...

  2. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  3. 修改windows系统文件权限

    修改windows系统文件总是提示没有权限,虽然已是administrator也不管用. 以下方法可以解决: 右键属性,安全,高级,所有者,编辑,选择当前用户并确定, 回到上一页再确定, 然后在安全页 ...

  4. windows系统文件和linux系统文件

    windows系统文件和linux系统文件 1.单用户操作系统和多用户操作系统 单用户操作系统:指一台计算机在同一时间 只能由一个用户 使用,一个用户独自享用系统的全部硬件和软件资源 Windows ...

  5. Windows系统文件详解【大全】

    这是网络上转载的一篇文章,找不到原创的出处了--详细的介绍了WINDOWS系统文件的用途,我想各位保存一份以后说不定会有用吧,呵呵..这里按A到Z为大家分好类了,查询的话可以按键盘的Ctrl+F进行搜 ...

  6. 清除Windows系统图标缓存

    如果改变程序图标重新编译之后看到的图标并未改变,这可能不windows缓存了之前的图标导致的,需要清除Window的图标缓存来显示正确的图标. 下面是清除Windows系统图标缓存的批处理代码: re ...

  7. Windows桌面图标不见了,可能是结束了explorer.exe进程导致

    Windows桌面图标不见了,怎么办?那么可能是你关掉了explorer.exe的进程. 解决办法: ① Ctrl+shift+delete打开任务管理器,查看进程是否有explorer.exe ② ...

  8. 【管理员已阻止你运行此应用】windows defender图标打叉,无法打开mmc.exe解决办法

    今天开机遇到一个奇怪的问题,发现windows defender图标上面打了个×: 打开按照系统提示需要restart服务,但是无法重启服务,会出现错误,然后尝试手动重启服务,准备打开管理控制台mmc ...

  9. [ES4封装教程]3.使用 Easy Sysprep v4 封装 Windows 7

    (一)安装与备份系统 1.安装 Windows 7 可能很多人会说,安装Win7谁不会,这也用说?装Win7的确人人都会,但如何安装才是最适合系统封装的,就未必是人人都会了.安装是封装之本,没有好的安 ...

随机推荐

  1. Vue2.0 新手入门 — 从环境搭建到发布

    什么是 Vue Vue 是一个前端框架,特点是数据绑定 比如你改变一个输入框 Input 标签的值,会自动同步更新到页面上其他绑定该输入框的组件的值 组件化 页面上小到一个按钮都可以是一个单独的文件. ...

  2. django logger转载

    https://www.cnblogs.com/jiangchunsheng/p/8986452.html https://www.cnblogs.com/jeavy/p/10926197.html ...

  3. Python 模拟伯努利试验和二项分布

    1.模拟 27 次投掷硬币的伯努利试验 代码: from scipy import stats import numpy as np p = 0.5 # 生成冻结分布函数 bernoulliDist ...

  4. KL散度=交叉熵-熵

    熵:可以表示一个事件A的自信息量,也就是A包含多少信息. KL散度:可以用来表示从事件A的角度来看,事件B有多大不同. 交叉熵:可以用来表示从事件A的角度来看,如何描述事件B. 一种信息论的解释是: ...

  5. 洛谷P2486 [SDOI2011]染色(树链剖分+线段树判断边界)

    [题目链接] [思路]: 涉及到树上区间修改操作,所以使用树链剖分,涉及到区间查询,所以使用线段树. update操作时,就正常操作,难点在于query操作的计数. 因为树链剖分的dfs序只能保证一条 ...

  6. wordpress怎么用AMP加速器呢

    AMP项目(Accelerated Mobile Pages)是一个开放源代码计划,旨在为所有人打造更好的网络体验.借助该项目,用户可以打造出在各种设备和分发平台上都能始终如一地快速加载且效果出色的精 ...

  7. appache开启自定义404错误并编写404.html

    1,让apache支持.htaccess 我们要找到apache安装目录下的httpd.conf文件,在里面找到 <Directory /> Options FollowSymLinks ...

  8. [RN] React Native 实现图片预览

    [RN] React Native 实现图片预览 效果预览: 代码如下: 'use strict'; import React, {Component} from 'react'; import {I ...

  9. 删除github中某个文件夹

    在上传项目到github时,忘记忽略了某个文件夹target,就直接push上去了, 最后意识到了此问题,决定删除掉远程仓库中的target文件夹 删除前: 删除后: 在github上只能删除仓库,却 ...

  10. Flask视图之CBV示列

    from flask import views, Flask app=Flask(__name__) class loginview( views.MethodView ):   # 继承views. ...