创建窗口 右键单击特定文件夹的上下文菜单


如何

创建为特定文件夹中的文件/文件夹显示的上下文菜单。
假设有一个目录"D:\RandomCodes">
如何为其中的任何文件/文件夹创建自定义上下文菜单项"在 MyApp 中打开"?不应为任何其他目录显示此菜单项。我知道如果我在HKCR/Directory/Shell中添加该条目,它会起作用,但随后它将出现在所有文件和文件夹中。请指导我完成此操作。

示例:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTFoldershellNetBeans]
"AppliesTo"="System.ItemPathDisplay:"NetBeansProjects""
@="Open with NetBeans"
[HKEY_CLASSES_ROOTFoldershellNetBeanscommand]
@=""C:\Program Files\NetBeans 7.2.1\bin\netbeans64.exe" --open "%1""

更多信息在这里:

http://msdn.microsoft.com/en-us/library/cc144171%28VS.85%29.aspx

我知道这是一个非常古老的问题,但对于将来遇到此问题的任何人,我发现最简单的方法是将字符串值添加到名为"AppliesTo"的键中,并将其值设置为"under:{path}">

在我的示例中,我希望它只在 T 驱动器中查找,所以我的字符串值是"适用于":"下:T:"。

在 C# 中,这可以通过以下方法轻松实现:

RegistryKey _key = Registry.ClassesRoot.OpenSubKey("Folder\Shell", true);
RegistryKey newkey = _key.CreateSubKey("My Menu Item");
newkey.SetValue("AppliesTo", "under:T:");
RegistryKey subNewkey = newkey.CreateSubKey("Command");
subNewkey.SetValue("", "C:\yourApplication.exe");
subNewkey.Close();
newkey.Close();
_key.Close();

可以修改 IShellExtInit 的代码:

    STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pidl,LPDATAOBJECT pDataObj,HKEY hk)
    {
    // Initialize can be called more than once
    // If Initialize has already been called, release the old
    // IDataObject pointer.
    if (m_pDataObj)
    { 
        m_pDataObj->Release(); 
    }
    // If a data object pointer was passed in, save it and
    // extract the file name. 
    if (pDataObj == NULL)
        return E_INVALIDARG;
        m_pDataObj = pDataObj; 
        pDataObj->AddRef(); 
        STGMEDIUM   medium;
        FORMATETC   fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
        UINT        uCount;
        HRESULT hr = pDataObj->GetData(&fe, &medium);
        if (FAILED(hr))
            return E_INVALIDARG;
        // save the file name
        if (DragQueryFile((HDROP) medium.hGlobal, 0xFFFFFFFF, NULL, 0)==1) 
        {
            DragQueryFile((HDROP) medium.hGlobal, 0, m_szFile, 
                sizeof(m_szFile));
            if (lstrcmpi(m_szFile, "D:\RandomCodes") == 0) 
            {
                hr = NOERROR;
            }
            else 
                hr = E_INVALIDARG;
        }
        else
            hr = E_INVALIDARG;
        ReleaseStgMedium(&medium);
        return hr;
}

最新更新