Windows系统SHELL图标获取的功能类分享

Posted veis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows系统SHELL图标获取的功能类分享相关的知识,希望对你有一定的参考价值。

1.用途

- 可以获取系统图标列表

- 可以获取任意文件/文件夹/磁盘的图标

- 可以获取任意文件/文件夹/磁盘图标在系统图标列表中的位置

2.头文件

#pragma once
#include <winnt.h>

class CSHGetFileInfo
{
public:
	/// 获取系统图像列表
	/// @param[in] bSmallIcon ture则为小图标,false则为大图标
	static HIMAGELIST  GetSystemImageListHandle(BOOL bSmallIcon = TRUE);

	/// 获取系统图片列表的文件图片索引
	/// @param[in] strFileName 文件名
	/// @param[in] bSmallIcon ture则为小图标,false则为大图标
	static int GetFileIconIndex(CString strFileName, BOOL bSmallIcon = TRUE);

	/// 获取系统图片列表的文件夹图片索引
	/// @param[in] bSmallIcon
	static int GetDirIconIndex(BOOL bSmallIcon = TRUE);

	/// 获取文件的icon的句柄
	/// @param[in] diskName 磁盘名
	/// @param[in] bSmallIcon ture则为小图标,false则为大图标
	static int GetDiskIconIndex(LPCTSTR diskName, BOOL bSmallIcon = TRUE);

	/// 获取文件的icon的句柄
	/// @param[in] strFileName 文件名
	/// @param[in] bSmallIcon ture则为小图标,false则为大图标
	static HICON GetFileIconHandle(CString strFileName, BOOL bSmallIcon = TRUE);

	/// 获取文件夹的icon的句柄
	/// @param[in] bSmallIcon ture则为小图标,false则为大图标
	static HICON GetFolderIconHandle(BOOL bSmallIcon = TRUE);

	/// 获取磁盘的icon的句柄
		/// @param[in] diskName 磁盘名
	/// @param[in] bSmallIcon ture则为小图标,false则为大图标
	static HICON GetDiskIconHandle(LPCTSTR diskName, BOOL bSmallIcon = TRUE);

	/// 获取文件类型
	/// @param[in] strFileName 文件名
	static CString GetFileType(CString strFileName);

};

  

3.源文件

#include "pch.h"
#include "CSHGetFileInfo.h"


HIMAGELIST  CSHGetFileInfo::GetSystemImageListHandle(BOOL bSmallIcon)
{
	HIMAGELIST hSystemImageList;
	SHFILEINFO ssfi;
	if (bSmallIcon)
	{
		hSystemImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("c:\"), 0, &ssfi,
			sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
	}
	else
	{
		hSystemImageList = (HIMAGELIST)SHGetFileInfo( (LPCTSTR)_T("c:\"), 0, &ssfi, 
			sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
	}
	return hSystemImageList;
}


int CSHGetFileInfo::GetFileIconIndex(CString strFileName, BOOL bSmallIcon)
{
	SHFILEINFO sfi;
	if (bSmallIcon)
	{
		SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi,
			sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
	}
	else
	{
		SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi,
			sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
	}
	return sfi.iIcon;
}

int CSHGetFileInfo::GetDirIconIndex(BOOL bSmallIcon)
{
	SHFILEINFO sfi;
	if (bSmallIcon)
	{
		SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi,
			sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
	}
	else
	{
		SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi,
			sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
	}
	return sfi.iIcon;

}

int CSHGetFileInfo::GetDiskIconIndex(LPCTSTR diskName, BOOL bSmallIcon)
{
	SHFILEINFO sfi;
	DWORD attr = ::GetFileAttributes(diskName);
	if (bSmallIcon)
	{
		::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi),
			SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息
	}
	else
	{
		::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi),
			SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息
	}
	return sfi.iIcon;
}

HICON CSHGetFileInfo::GetFileIconHandle(CString strFileName, BOOL bSmallIcon)
{
	SHFILEINFO sfi;
	if (bSmallIcon)
	{
		SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi,
			sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
	}
	else
	{
		SHGetFileInfo( (LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi,
			sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
	}
	return sfi.hIcon;
}

HICON CSHGetFileInfo::GetFolderIconHandle(BOOL bSmallIcon)
{
	SHFILEINFO sfi;
	if (bSmallIcon)
	{
		SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi,
			sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
	}
	else
	{
		SHGetFileInfo( (LPCTSTR)_T("Doesn‘t matter"), FILE_ATTRIBUTE_DIRECTORY, &sfi,
			sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
	}
	return sfi.hIcon;
}

HICON CSHGetFileInfo::GetDiskIconHandle(LPCTSTR diskName, BOOL bSmallIcon)
{
	SHFILEINFO sfi;
	DWORD attr = ::GetFileAttributes(diskName);
	if (bSmallIcon)
	{
		::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi),
			SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息
	}
	else
	{
		::SHGetFileInfo(diskName, attr, &sfi, sizeof(sfi),
			SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES); //获取文件信息
	}
	return sfi.hIcon;
}

CString CSHGetFileInfo::GetFileType(CString strFileName)
{
	SHFILEINFO sfi;
	SHGetFileInfo((LPCTSTR)strFileName, FILE_ATTRIBUTE_NORMAL, &sfi, 
		sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
	return sfi.szTypeName;
}

  

以上是关于Windows系统SHELL图标获取的功能类分享的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Windows Power Shell

如何使用Shell32.SHGetFileInfo在Windows 7上获取文件夹图标

C# 访问 Windows 10 打印机图标

Win10通知区域图标设置;windows10系统图标合并;Windows10系统通知合并

vc下如何设置pe文件图标为系统文件夹图标?不是设置,是不带ico的,直接获取的.

java 如何得到文件的系统图标