winapi - 当我的 shell 扩展文件夹为空时显示 'This folder is empty' 背景

标签 winapi explorer shell-extensions hresult apimonitor

在我的 shell 扩展中,我想模仿资源管理器的行为并显示“此文件夹为空”消息,而实际上我的文件夹为空:

ThisFolderIsEmpty

但是,我无法完成它。

使用 API Monitor,我看到当资源管理器刷新空文件夹时,IEnumIDList::Next() 返回以下内容:

APIMonitorScreenshot

意思是,返回的“下一个”项目为NULL,项目数量为0,结果为S_FALSE

如上所述,我尝试模仿返回值,实际上没有为该文件夹加载任何项目,但也没有出现消息。

那么什么 API 会触发此消息?

最佳答案

您的 IEnumIDList 实现必须实现 IObjectWithSite。实现示例:

  var
    ServiceProvider: IServiceProvider;
    ShellBrowser: IShellBrowser;
    ShellView: IShellView;
    FolderView2: IFolderView2;
  begin
    if not Assigned(ASite) then Exit;
    OleCheck(ASite.QueryInterface(IServiceProvider, ServiceProvider));
    try
      OleCheck(ServiceProvider.QueryService(SID_STopLevelBrowser, IShellBrowser, ShellBrowser));
      try
        OleCheck(ShellBrowser.QueryActiveShellView(ShellView));
        try
          OleCheck(ShellView.QueryInterface(IFolderView2, FolderView2));
          try
            FolderView2.SetText(FVST_EMPTYTEXT, 'The message you want to see');
          finally
            FolderView2 := nil;
          end;
        finally
          ShellView := nil;
        end;
      finally
        ShellBrowser := nil;
      end;
    finally
      ServiceProvider := nil;
    end;
  end;

结果:

enter image description here

您也可以在 IShellFolder 实现中使用相同的代码。

关于winapi - 当我的 shell 扩展文件夹为空时显示 'This folder is empty' 背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28983132/

相关文章:

c# - CB_SELECTSTRING 不适用于日文项目

c# - 附加到 shell 扩展中的默认工具提示

c++ - 加载和卸载 shell 扩展库

c - 句柄到窗口句柄

windows - 如何判断文件是否没有关联的图标

css - 奇怪的 Internet Explorer 和 Firefox CSS 问题

powershell - 获取从资源管理器菜单到 powershell 变量的文件夹路径

jquery - ASP.NET MVC 2 的文件管理器?

Windows 资源管理器备用数据流外壳扩展

c++ - Windows 服务问题(C++、WinAPI)