【问题标题】:Create windows right click context menu for SPECIFIC folders为特定文件夹创建 Windows 右键单击​​上下文菜单
【发布时间】:2012-05-28 00:31:44
【问题描述】:

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

【问题讨论】:

    标签: contextmenu windows-shell


    【解决方案1】:

    示例:

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

    更多信息在这里:

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

    【讨论】:

      【解决方案2】:

      是否可以修改您的 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;
      
      }
      

      【讨论】:

      • 嘿,谢谢!我实际上只是在做类似的事情!基本上我不想写一个shell扩展。我只想通过管理注册表值来实现这一点。例如Directory/Shellex 下的设置键为所有目录提供了菜单项。我想对特定目录做同样的事情,但这似乎是不可能的。只会这样做!谢谢!
      【解决方案3】:

      我知道这是一个很老的问题,但是对于以后遇到这个问题的任何人,我发现最简单的方法是将一个字符串值添加到名为“AppliesTo”的键中,并将其值设置为“under:{路径}"

      在我的示例中,我希望它只在 T 驱动器中查找,因此我的字符串值为 "AppliesTo":"under: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();
      

      【讨论】:

        猜你喜欢
        • 2014-01-11
        • 1970-01-01
        • 2013-02-11
        • 1970-01-01
        • 2021-04-03
        • 2016-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多