2012-05-21 129 views
4

如何創建出現在特定文件夾內的文件/文件夾的上下文菜單。
說有一個目錄「D:\ RandomCodes」
如何創建一個自定義上下文菜單項「在MyApp中打開」任何文件/文件夾在裏面?這個菜單項不應該出現在任何其他目錄中。我知道如果我在HKCR/Directory/Shell中添加條目,它會起作用,但是它隨時會出現在所有文件和文件夾中。請通過這個指導我。爲特定文件夾創建窗口右鍵單擊上下文菜單

回答

3

可能對矯正你的代碼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; 

} 
+0

類似的問題::http://stackoverflow.com/questions/9064272/contextual-menu-to-a-specific-folder – Xearinox

+0

嘿感謝

在C#中,這是很容易用下面的完成!我實際上只是在做類似的事情!基本上我不想寫一個shell擴展。我想通過僅管理註冊表值來實現這一點。例如在Directory/Shellex下設置鍵可以爲所有目錄提供菜單項。我想爲特定的目錄做同樣的事情,但這似乎不可能。只會這樣做!謝謝! –

5

例如:

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

3

我知道這是一個很老的問題,但對於未來遇到此問題的任何人,我發現最簡單的方法是將字符串值添加到名爲「AppliesTo」的鍵並將其值設置爲「under:{path}」

在我的示例中,我希望它只能在T驅動器中查找,所以我的字符串值是「適用於」:「下:T:」。

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(); 
相關問題