日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

按文件类型获取其图标

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 按文件类型获取其图标 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

有很多軟件如"WinRar" 能在它的文件列表中顯示各類文件相關的圖標。

在網上查了一下,發(fā)現(xiàn)可以用 SHGetFileInfo、ExtractAssociatedIcon等winapi函數根據文件獲取文件在系統(tǒng)中對應的圖標。

剛開始用的時候覺得好像它們只能返回存在的文件的圖標。 若要用這些函數去根據擴展名獲取圖標,則需要先創(chuàng)建一個假文件, 獲取圖標后又刪除,太麻煩。

后來重新查了一下,發(fā)現(xiàn)用SHGetFileInfo函數可以根據擴展名獲取文件圖標。

以下為示例代碼。

using?System;
using?System.Drawing;
using?System.Collections;
using?System.ComponentModel;
using?System.Data;
using?System.Runtime.InteropServices;

namespace?IconHelper
{
????
/**////?<summary>
????
///?Provides?static?methods?to?read?system?icons?for?both?folders?and?files.
????
///?</summary>
????
///?<example>
????
///?<code>IconReader.GetFileIcon("c:\\general.xls");</code>
????
///?</example>

????public?class?IconReader
????
{
????????
/**////?<summary>
????????
///?Options?to?specify?the?size?of?icons?to?return.
????????
///?</summary>

????????public?enum?IconSize
????????
{
????????????
/**////?<summary>
????????????
///?Specify?large?icon?-?32?pixels?by?32?pixels.
????????????
///?</summary>

????????????Large?=?0,
????????????
/**////?<summary>
????????????
///?Specify?small?icon?-?16?pixels?by?16?pixels.
????????????
///?</summary>

????????????Small?=?1
????????}


????????
/**////?<summary>
????????
///?Options?to?specify?whether?folders?should?be?in?the?open?or?closed?state.
????????
///?</summary>

????????public?enum?FolderType
????????
{
????????????
/**////?<summary>
????????????
///?Specify?open?folder.
????????????
///?</summary>

????????????Open?=?0,
????????????
/**////?<summary>
????????????
///?Specify?closed?folder.
????????????
///?</summary>

????????????Closed?=?1
????????}


????????
/**////?<summary>
????????
///?Returns?an?icon?for?a?given?file?-?indicated?by?the?name?parameter.
????????
///?</summary>
????????
///?<param?name="name">Pathname?for?file.</param>
????????
///?<param?name="size">Large?or?small</param>
????????
///?<param?name="linkOverlay">Whether?to?include?the?link?icon</param>
????????
///?<returns>System.Drawing.Icon</returns>

????????public?static?System.Drawing.Icon?GetFileIcon(string?name,?IconSize?size,?bool?linkOverlay)
????????
{
????????????Shell32.SHFILEINFO?shfi?
=?new?Shell32.SHFILEINFO();
????????????
uint?flags?=?Shell32.SHGFI_ICON?|?Shell32.SHGFI_USEFILEATTRIBUTES;

????????????
if?(true?==?linkOverlay)?flags?+=?Shell32.SHGFI_LINKOVERLAY;

????????????
/**//*?Check?the?size?specified?for?return.?*/
????????????
if?(IconSize.Small?==?size)
????????????
{
????????????????flags?
+=?Shell32.SHGFI_SMALLICON;
????????????}

????????????
else
????????????
{
????????????????flags?
+=?Shell32.SHGFI_LARGEICON;
????????????}


????????????Shell32.SHGetFileInfo(name,
????????????????Shell32.FILE_ATTRIBUTE_NORMAL,
????????????????
ref?shfi,
????????????????(
uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
????????????????flags);

????????????
//?Copy?(clone)?the?returned?icon?to?a?new?object,?thus?allowing?us?to?clean-up?properly
????????????System.Drawing.Icon?icon?=?(System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();
????????????User32.DestroyIcon(shfi.hIcon);????????
//?Cleanup
????????????return?icon;
????????}


????????
/**////?<summary>
????????
///?Used?to?access?system?folder?icons.
????????
///?</summary>
????????
///?<param?name="size">Specify?large?or?small?icons.</param>
????????
///?<param?name="folderType">Specify?open?or?closed?FolderType.</param>
????????
///?<returns>System.Drawing.Icon</returns>

????????public?static?System.Drawing.Icon?GetFolderIcon(IconSize?size,?FolderType?folderType)
????????
{
????????????
//?Need?to?add?size?check,?although?errors?generated?at?present!
????????????uint?flags?=?Shell32.SHGFI_ICON?|?Shell32.SHGFI_USEFILEATTRIBUTES;

????????????
if?(FolderType.Open?==?folderType)
????????????
{
????????????????flags?
+=?Shell32.SHGFI_OPENICON;
????????????}


????????????
if?(IconSize.Small?==?size)
????????????
{
????????????????flags?
+=?Shell32.SHGFI_SMALLICON;
????????????}

????????????
else
????????????
{
????????????????flags?
+=?Shell32.SHGFI_LARGEICON;
????????????}


????????????
//?Get?the?folder?icon
????????????Shell32.SHFILEINFO?shfi?=?new?Shell32.SHFILEINFO();
????????????Shell32.SHGetFileInfo(
null,
????????????????Shell32.FILE_ATTRIBUTE_DIRECTORY,
????????????????
ref?shfi,
????????????????(
uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
????????????????flags);

????????????System.Drawing.Icon.FromHandle(shfi.hIcon);????
//?Load?the?icon?from?an?HICON?handle

????????????
//?Now?clone?the?icon,?so?that?it?can?be?successfully?stored?in?an?ImageList
????????????System.Drawing.Icon?icon?=?(System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();

????????????User32.DestroyIcon(shfi.hIcon);????????
//?Cleanup
????????????return?icon;
????????}

????}


????
/**////?<summary>
????
///?Wraps?necessary?Shell32.dll?structures?and?functions?required?to?retrieve?Icon?Handles?using?SHGetFileInfo.?Code
????
///?courtesy?of?MSDN?Cold?Rooster?Consulting?case?study.
????
///?</summary>
????
///?


????
//?This?code?has?been?left?largely?untouched?from?that?in?the?CRC?example.?The?main?changes?have?been?moving
????
//?the?icon?reading?code?over?to?the?IconReader?type.
????public?class?Shell32
????
{

????????
public?const?int?MAX_PATH?=?256;
????????[StructLayout(LayoutKind.Sequential)]
????????
public?struct?SHITEMID
????????
{
????????????
public?ushort?cb;
????????????[MarshalAs(UnmanagedType.LPArray)]
????????????
public?byte[]?abID;
????????}


????????[StructLayout(LayoutKind.Sequential)]
????????
public?struct?ITEMIDLIST
????????
{
????????????
public?SHITEMID?mkid;
????????}


????????[StructLayout(LayoutKind.Sequential)]
????????
public?struct?BROWSEINFO
????????
{
????????????
public?IntPtr?hwndOwner;
????????????
public?IntPtr?pidlRoot;
????????????
public?IntPtr?pszDisplayName;
????????????[MarshalAs(UnmanagedType.LPTStr)]
????????????
public?string?lpszTitle;
????????????
public?uint?ulFlags;
????????????
public?IntPtr?lpfn;
????????????
public?int?lParam;
????????????
public?IntPtr?iImage;
????????}


????????
//?Browsing?for?directory.
????????public?const?uint?BIF_RETURNONLYFSDIRS?=?0x0001;
????????
public?const?uint?BIF_DONTGOBELOWDOMAIN?=?0x0002;
????????
public?const?uint?BIF_STATUSTEXT?=?0x0004;
????????
public?const?uint?BIF_RETURNFSANCESTORS?=?0x0008;
????????
public?const?uint?BIF_EDITBOX?=?0x0010;
????????
public?const?uint?BIF_VALIDATE?=?0x0020;
????????
public?const?uint?BIF_NEWDIALOGSTYLE?=?0x0040;
????????
public?const?uint?BIF_USENEWUI?=?(BIF_NEWDIALOGSTYLE?|?BIF_EDITBOX);
????????
public?const?uint?BIF_BROWSEINCLUDEURLS?=?0x0080;
????????
public?const?uint?BIF_BROWSEFORCOMPUTER?=?0x1000;
????????
public?const?uint?BIF_BROWSEFORPRINTER?=?0x2000;
????????
public?const?uint?BIF_BROWSEINCLUDEFILES?=?0x4000;
????????
public?const?uint?BIF_SHAREABLE?=?0x8000;

????????[StructLayout(LayoutKind.Sequential)]
????????
public?struct?SHFILEINFO
????????
{
????????????
public?const?int?NAMESIZE?=?80;
????????????
public?IntPtr?hIcon;
????????????
public?int?iIcon;
????????????
public?uint?dwAttributes;
????????????[MarshalAs(UnmanagedType.ByValTStr,?SizeConst?
=?MAX_PATH)]
????????????
public?string?szDisplayName;
????????????[MarshalAs(UnmanagedType.ByValTStr,?SizeConst?
=?NAMESIZE)]
????????????
public?string?szTypeName;
????????}
;

????????
public?const?uint?SHGFI_ICON?=?0x000000100;?????//?get?icon
????????public?const?uint?SHGFI_DISPLAYNAME?=?0x000000200;?????//?get?display?name
????????public?const?uint?SHGFI_TYPENAME?=?0x000000400;?????//?get?type?name
????????public?const?uint?SHGFI_ATTRIBUTES?=?0x000000800;?????//?get?attributes
????????public?const?uint?SHGFI_ICONLOCATION?=?0x000001000;?????//?get?icon?location
????????public?const?uint?SHGFI_EXETYPE?=?0x000002000;?????//?return?exe?type
????????public?const?uint?SHGFI_SYSICONINDEX?=?0x000004000;?????//?get?system?icon?index
????????public?const?uint?SHGFI_LINKOVERLAY?=?0x000008000;?????//?put?a?link?overlay?on?icon
????????public?const?uint?SHGFI_SELECTED?=?0x000010000;?????//?show?icon?in?selected?state
????????public?const?uint?SHGFI_ATTR_SPECIFIED?=?0x000020000;?????//?get?only?specified?attributes
????????public?const?uint?SHGFI_LARGEICON?=?0x000000000;?????//?get?large?icon
????????public?const?uint?SHGFI_SMALLICON?=?0x000000001;?????//?get?small?icon
????????public?const?uint?SHGFI_OPENICON?=?0x000000002;?????//?get?open?icon
????????public?const?uint?SHGFI_SHELLICONSIZE?=?0x000000004;?????//?get?shell?size?icon
????????public?const?uint?SHGFI_PIDL?=?0x000000008;?????//?pszPath?is?a?pidl
????????public?const?uint?SHGFI_USEFILEATTRIBUTES?=?0x000000010;?????//?use?passed?dwFileAttribute
????????public?const?uint?SHGFI_ADDOVERLAYS?=?0x000000020;?????//?apply?the?appropriate?overlays
????????public?const?uint?SHGFI_OVERLAYINDEX?=?0x000000040;?????//?Get?the?index?of?the?overlay

????????
public?const?uint?FILE_ATTRIBUTE_DIRECTORY?=?0x00000010;
????????
public?const?uint?FILE_ATTRIBUTE_NORMAL?=?0x00000080;

????????[DllImport(
"Shell32.dll")]
????????
public?static?extern?IntPtr?SHGetFileInfo(
????????????
string?pszPath,
????????????
uint?dwFileAttributes,
????????????
ref?SHFILEINFO?psfi,
????????????
uint?cbFileInfo,
????????????
uint?uFlags
????????????);
????}


????
/**////?<summary>
????
///?Wraps?necessary?functions?imported?from?User32.dll.?Code?courtesy?of?MSDN?Cold?Rooster?Consulting?example.
????
///?</summary>

????public?class?User32
????
{
????????
/**////?<summary>
????????
///?Provides?access?to?function?required?to?delete?handle.?This?method?is?used?internally
????????
///?and?is?not?required?to?be?called?separately.
????????
///?</summary>
????????
///?<param?name="hIcon">Pointer?to?icon?handle.</param>
????????
///?<returns>N/A</returns>

????????[DllImport("User32.dll")]
????????
public?static?extern?int?DestroyIcon(IntPtr?hIcon);
????}

}

轉載于:https://www.cnblogs.com/TianFang/archive/2006/05/24/407620.html

總結

以上是生活随笔為你收集整理的按文件类型获取其图标的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。