获取当前的IShellView用户正在与之交互

时间:2019-01-27 16:27:08

标签: windows winapi

我正在编写一个带有上下文菜单处理程序的Shell Extension。右键单击一个文件,然后选择上下文菜单项,将在同一文件夹中创建另一个文件。

我希望在操作后在Windows File Explorer中自动选择新文件,就像用户粘贴了文件一样。据我了解,我需要使用IShellView::SelectItem。但是,如何获取用户正在与之交互的Shell(文件浏览器)的IShellView对象?

1 个答案:

答案 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

使用