当我的 shell 扩展文件夹为空时显示 'This folder is empty' 背景
Showing 'This folder is empty' background when my shell extension folder is empty
在我的 shell 扩展中,我想模仿资源管理器的行为并显示“此文件夹为空”消息,而实际上我的文件夹是空的:
但是,我做不到。
使用 API 监视器,我看到当资源管理器刷新一个空文件夹时,IEnumIDList::Next()
return 如下:
意思是,'next'项returned是NULL
,项数是0
,结果是S_FALSE
。
如前所述,我试图模仿 return 值,但确实没有为该文件夹加载任何项目,但也没有出现任何消息。
那么什么 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;
结果:
您也可以在 IShellFolder 实现中使用相同的代码。
这是一个老问题,但我写下了我的答案。可能对某人有用
您可以在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;
}
在我的 shell 扩展中,我想模仿资源管理器的行为并显示“此文件夹为空”消息,而实际上我的文件夹是空的:
但是,我做不到。
使用 API 监视器,我看到当资源管理器刷新一个空文件夹时,IEnumIDList::Next()
return 如下:
意思是,'next'项returned是NULL
,项数是0
,结果是S_FALSE
。
如前所述,我试图模仿 return 值,但确实没有为该文件夹加载任何项目,但也没有出现任何消息。
那么什么 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;
结果:
您也可以在 IShellFolder 实现中使用相同的代码。
这是一个老问题,但我写下了我的答案。可能对某人有用
您可以在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;
}