2012-05-21 2 views
4

Как создать контекстное меню, которое отображается для файлов/папок внутри определенной папки.
Скажите, есть ли каталог «D: \ RandomCodes»
Как создать пользовательский элемент контекстного меню «Открыть в MyApp» для любого файла/папки внутри этого? Этот пункт меню не должен отображаться ни для какого другого каталога. Я знаю, если я добавлю запись в HKCR/Directory/Shell, она будет работать, но тогда она появится для всех файлов и папок во всем мире. Пожалуйста, помогите мне в этом.Создайте контекстное меню контекстного меню Windows для папок SPECIFIC

ответ

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

Эй спасибо ! Я на самом деле делал что-то подобное этому! В принципе, я не хотел писать расширение оболочки. Я хотел достигнуть этого, управляя только значениями реестра. например установочные клавиши в разделе 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 Drive, поэтому моя строка Значение «Применяется»: «под: 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();