Как создать контекстное меню, которое отображается для файлов/папок внутри определенной папки.
Скажите, есть ли каталог «D: \ RandomCodes»
Как создать пользовательский элемент контекстного меню «Открыть в MyApp» для любого файла/папки внутри этого? Этот пункт меню не должен отображаться ни для какого другого каталога. Я знаю, если я добавлю запись в HKCR/Directory/Shell, она будет работать, но тогда она появится для всех файлов и папок во всем мире. Пожалуйста, помогите мне в этом.Создайте контекстное меню контекстного меню Windows для папок SPECIFIC
4
A
ответ
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;
}
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();
Похожий вопрос: http://stackoverflow.com/questions/9064272/contextual-menu-to-a-specific-folder – Xearinox
Эй спасибо ! Я на самом деле делал что-то подобное этому! В принципе, я не хотел писать расширение оболочки. Я хотел достигнуть этого, управляя только значениями реестра. например установочные клавиши в разделе Directory/Shellex предлагают пункт меню для всех каталогов. Я хотел сделать то же самое для конкретных каталогов, но это не представляется возможным. Сделай это только так! Благодаря! –