如何创建为特定文件夹内的文件/文件夹显示的上下文菜单。
假设有一个目录“D:\RandomCodes”
如何为其中的任何文件/文件夹创建自定义上下文菜单项“在 MyApp 中打开”?此菜单项不应出现在任何其他目录中。我知道如果我在 HKCR/Directory/Shell 中添加条目,它会起作用,但它会出现在所有文件和文件夹中。请指导我完成这个。
问问题
6244 次
3 回答
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
于 2013-01-14T21:51:34.847 回答
4
是否可以修改 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;
}
于 2012-05-21T15:58:43.553 回答
4
我知道这是一个很老的问题,但对于以后遇到这个问题的人来说,我发现最简单的方法是将一个字符串值添加到名为“AppliesTo”的键中,并将其值设置为“under:{path}”
在我的示例中,我希望它只查看 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();
于 2016-07-06T15:37:11.980 回答