当我的shell扩展文件夹为空时,显示“此文件夹为空”背景

时间:2015-03-11 09:45:54

标签: winapi explorer shell-extensions hresult

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

ThisFolderIsEmpty

但是,我无法实现它。

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

APIMonitorScreenshot

意思是,' next'返回的项目为NULL,项目数为0,结果为S_FALSE

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

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

2 个答案:

答案 0 :(得分:3)

您的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实现中使用相同的代码。

答案 1 :(得分:1)

这是一个老问题,但我写下了答案。对某人可能有用

您可以使用IShellFolder::CreateViewObject方法更改空文件夹视图文本,如下所示:

  if (riid == IID_IShellView)
  {
    m_hwndOwner = hwndOwner;

    SFV_CREATE sfvData = { sizeof sfvData };
    const CComQIPtr<IShellFolder> spFolder = GetUnknown();
    sfvData.psfvcb = this;
    sfvData.pshf = spFolder;

    auto hr = SHCreateShellFolderView(&sfvData, reinterpret_cast<IShellView**>(ppv));

    // Here we change the text
    auto pSV = *reinterpret_cast<IShellView**>(ppv);
    CComPtr<IFolderView2> pFV;
    pSV->QueryInterface(IID_PPV_ARGS(&pFV));
    pFV->SetText(FVST_EMPTYTEXT, L"Put your text here!");
    //-

    return hr;
  }