一个Windows API的SHGetFileInfo()方法的Wrapper

头文件

/// @class CSHGetFileInfo
/// SHGetFileInfo的包裹类
class CSHGetFileInfo
{

public:
    CSHGetFileInfo();

    virtual ~CSHGetFileInfo();

    /// 获取系统图像列表
    /// @param[in] bSmallIcon ture则为小图标,false则为大图标
    HIMAGELIST  GetSystemImageListHandle( BOOL bSmallIcon );

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

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

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

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

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

};

cpp文件

CSHGetFileInfo::CSHGetFileInfo()
{

}

CSHGetFileInfo::~CSHGetFileInfo()
{

}


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)"Doesn't matter", 
            FILE_ATTRIBUTE_DIRECTORY,
            &sfi, 
            sizeof(SHFILEINFO), 
            SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
    }
    else
    {
        SHGetFileInfo(
            (LPCTSTR)"Doesn't matter", 
            FILE_ATTRIBUTE_DIRECTORY,
            &sfi, 
            sizeof(SHFILEINFO), 
            SHGFI_SYSICONINDEX | 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)"Doesn't matter", 
            FILE_ATTRIBUTE_DIRECTORY,
            &sfi, 
            sizeof(SHFILEINFO), 
            SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
    }
    else
    {
        SHGetFileInfo(
            (LPCTSTR)"Does not matter", 
            FILE_ATTRIBUTE_DIRECTORY,
            &sfi, 
            sizeof(SHFILEINFO), 
            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;
}

时间: 2024-11-01 15:41:08

一个Windows API的SHGetFileInfo()方法的Wrapper的相关文章

C#+Windows API操纵系统菜单

window|菜单 一.前言 本文针对C#.NET中没有提供直接的类似SystemMenu的属性或类似GetSystemMenu的成员函数的情况,通过调用Windows API设计了一个C#类SystemMenu,从而实现了传统的对于系统菜单的操作. 二.系统菜单简介 当你单击窗口图标或右击窗口标题栏时系统菜单即弹出.它包含当前窗口的默认行为.不同窗口的系统菜单看起来有些不同,如一个正常窗口的系统菜单看起来与一个工具栏子对话框窗口的菜单就不一样. 修改系统菜单的好处: ·添加应用程序自己定义的菜

初级Windows API C++语言版编程(3)

由于上一章的文章中我没有向大家介绍清楚初试化的具体实现,造成很多的读者无法很好的理解,这是我的失误.本人现在补上,请大家原谅. 一个Windows API程序的初始化主要分为为四个部分.1.窗口类的定义2.窗口类的注册3.创建窗口实例4.显示窗口 ①窗口类定义 在Windows应用程序中,窗口类定义了窗口的形式与功能.它的定义过程通过给窗口类数据结构WNDCLASS赋值来完成,这个数据结构包含窗口类的各个属性.窗口类的定义常用到以下几个函数,在这里一一介绍. 1.LoadIcon函数 LoadI

windows-删除ARP表的Windows API

问题描述 删除ARP表的Windows API 想找一个Windows API,功能是清空ARP表的,就是DOS下"arp -d"功能的函数,但没找到,望大神不吝赐教,万分感谢

C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法_C#教程

本文实例讲述了C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法.分享给大家供大家参考,具体如下: Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源-之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗.描绘图形.使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Pro

基于Windows API实现遍历所有文件并删除的方法_C 语言

本文实例讲述了基于Windows API实现遍历所有文件并删除的方法.分享给大家供大家参考.具体分析如下: 最近一直在学windows API,弄了一些好玩的东西(有点恶作剧了,请大家谨慎使用)... 下面是我现学现卖写的一个删除硬盘上所有文件的小程序 .... #include <windows.h> #include <stdio.h> #include <bitset> using namespace std; void DelFile(char *cFilePa

C#+低级Windows API钩子拦截键盘输入

window 一. 简介 猫和婴儿有很多共同之处.他们都喜欢吃家中养植的植物,都非常讨厌关门.他们也都爱玩弄你的键盘,结果是,你正发送给你的老板的电子邮件可能是以半截句子发送出去的,你的Excel帐户也被加入了一些乱七八糟的内容,并且你还没有注意到,当打开Windows资源管理器时,若干文件已经被移到了回收站! 其解决方案是,开发一个应用程序实现如下功能:只要键盘处于"威胁状态"你就可以进行切换,并确保任何键盘输入活动都不会造成危害.本文想展示如何使用一种低级Windows API钩子

C#调用windows api的要点

window     在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助.另外如果安装了Visual Studio .net的话,在C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Samples\Technologies\Interop\P

用Visual C#调用Windows API函数(转)

visual|window|函数 用Visual C#调用Windows API函数 北京机械工业学院研00级(100085)冉林仓       Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用WindowsAPI函数的接口, 也就是说具备调用动态连接库的能力.Visual C#和其它开发工具一样也能够调用动态链接库的API函数..NET框架本身提供了这样一种

C#中调用Windows API的要点

window 在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助.另外如果安装了Visual Studio .net的话,在C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Samples\Technologies\Interop\Platf