我正在编写一个带有上下文菜单处理程序的Shell Extension。右键单击一个文件,然后选择上下文菜单项,将在同一文件夹中创建另一个文件。
我希望在操作后在Windows File Explorer中自动选择新文件,就像用户粘贴了文件一样。据我了解,我需要使用IShellView::SelectItem。但是,如何获取用户正在与之交互的Shell(文件浏览器)的IShellView对象?
答案 0 :(得分:1)
您需要在上下文菜单对象中实现IObjectWithSite
接口:
class CMenuExtension : IShellExtInit, IContextMenu, IObjectWithSite {.. };
结果是SetSite
将在CMenuExtension::Initialize
之后和CMenuExtension::QueryContextMenu
之前被调用。在这里,您可以使用传递的pUnkSite
来获取IFolderView
和/或IShellView
接口。像这样
virtual HRESULT STDMETHODCALLTYPE SetSite(
/* [in] */ __RPC__in_opt IUnknown *pUnkSite)
{
if (_pUnkSite)
{
_pUnkSite->Release();
if (_pfv)
{
_pfv->Release();
_pfv = 0;
}
}
_pUnkSite = pUnkSite;
if (pUnkSite)
{
pUnkSite->AddRef();
IServiceProvider* psp;
if (0 <= pUnkSite->QueryInterface(IID_PPV_ARGS(&psp)))
{
IFolderView* pfv;
if (0 <= psp->QueryService(__uuidof(IFolderView), IID_PPV_ARGS(&pfv)))
{
_pfv = pfv;
IShellFolder* psf;
if (0 <= pfv->GetFolder(IID_PPV_ARGS(&psf)))
{
STRRET sr;
if (0 <= psf->GetDisplayNameOf(0, SHGDN_FORPARSING , &sr))
{
...
}
psf->Release();
}
}
psp->Release();
}
}
return S_OK;
}
因此您需要先向IServiceProvider
界面询问站点界面,然后致电
QueryService(__uuidof(IFolderView), IID_PPV_ARGS(&pfv)
对于__uuidof(IFolderView)
和/或IFolderView
接口的IShellView
。
说IFolderView
头也可以得到IShellFolder
界面。记住此对象接口,然后从InvokeCommand