【问题标题】:C++ show an icon оverlay over all empty foldersC++ 在所有空文件夹上显示一个图标оoverlay
【发布时间】:2011-04-15 22:20:53
【问题描述】:

我正在寻找 C++ 解决方案以在文件夹上显示图标覆盖。但我注意到在 .NET\Java +Shell 中编写覆盖代码确实是个坏主意,因为在使用资源管理器时会一直调用解释器。

所以我有示例如何在包含一些文本的文件上添加图标:http://www.codeproject.com/KB/shell/overlayicon.aspx

我需要用我的图标标记所有空文件夹。我该怎么做?

将不胜感激。

【问题讨论】:

  • 问题是关于如何知道一个文件夹是否有任何东西。因为我对c++一无所知。我可以从 c# 为某些指定的文件夹调用处理程序函数吗?有什么例子吗?
  • 为什么要调用shell图标处理程序?预计外壳会这样做。您只需向 shell 提供功能,它就会在需要绘制 shell 对象时使用处理程序 shell 扩展。
  • 你不懂shell扩展。 shell 调用处理程序。它要求提供覆盖图标。您的代码检查有问题的项目是否为空文件夹。如果是这样,那么您返回您的图标。如果不是,那么您告诉外壳不要绘制覆盖层。
  • @Evgeny 您可能会侥幸逃脱,因为检查速度非常快,并且一旦您在任何文件夹中发现不是文件夹的任何内容,您就可以停止检查。最坏的情况是当你有一个包含大量空文件夹的深层结构时,但我猜这种情况很少见。您必须注意网络卷或未安装的项目。但对于本地存储,它可能只是工作。也就是说,为什么不只对覆盖层进行一层递归并添加一个上下文菜单选项来递归检查呢?这听起来是一个很好的妥协。
  • "如何才能在 GetOverlayInfo 方法中只获取文件夹?"我不明白你的意思。您确定要使用覆盖图标执行此操作吗?客户知道一个文件夹是空的,或者只包含空的文件夹会做什么?

标签: c++ windows shell overlay windows-shell


【解决方案1】:

您需要创建一个实现 IShellIconOverlayIdentifier 的 COM 对象,就像那篇 codeproject 文章一样。

您的 IsMemberOf 方法如下所示:

STDMETHODIMP YourClassThatImplementsIShellIconOverlayIdentifier::IsMemberOf(PCWSTR pwszPath,DWORD Attr)
{
    if (!(Attr&FILE_ATTRIBUTE_DIRECTORY)) return S_FALSE; // Not a folder

    UINT count = 0;
    WIN32_FIND_DATAW wfd;
    LPWSTR bufSpec = (LPWSTR) LocalAlloc(LPTR,(lstrlenW(pwszPath)+2+1)*sizeof(WCHAR));
    if (bufSpec)
    {
        lstrcpyW(bufSpec,pwszPath);
        PathAddBackslashW(bufSpec);
        lstrcatW(bufSpec,L"*");
        HANDLE hFind = FindFirstFileW(bufSpec,&wfd);
        if (INVALID_HANDLE_VALUE!=hFind) do
        {
            ++count;
        } while( count<= 2 && FindNextFileW(hFind,&wfd) );
        FindClose(hFind);
        LocalFree(bufSpec);
    }

    return count==2 ? S_OK : S_FALSE;
}

(一个空文件夹包含两个特殊条目,“.”和“..”)

【讨论】:

  • 感谢您指出我的错误。我今天过得不好!
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 2014-05-21
  • 1970-01-01
  • 2021-04-12
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多