【问题标题】:Pin a folder to Navigation Pane in Windows Explorer在 Windows 资源管理器中将文件夹固定到导航窗格
【发布时间】:2014-07-09 18:30:17
【问题描述】:

我想创建一个文件夹并将其固定到Windows Explorer 中的Navigation Pane,但我不确定如何执行此操作。

我想创建类似于 DropBox 或 OneDrive 文件夹的东西。

类似的东西-

我查看了Manipulating the Windows 7 Explorer navigation pane 问题,但我认为这不是我想要的。该应用程序将在具有 Windows 7 到 Windows 10 的机器上运行。是否可以在所有这些操作系统上执行此操作?

任何帮助将不胜感激。

【问题讨论】:

标签: c# windows-explorer


【解决方案1】:

这部分记录在本文档中:Integrate a Cloud Storage Provider 尽管标题具有误导性;它适用于常规文件夹。此外,它还可以在 Windows 7、Windows 8.x 和 10 上正常运行。

所以,这里是一个 .BAT 文件的内容(使用标准的reg.exe 工具,但您可以很容易地用 C# 代码替换它),它可以创建像 OneDrive 这样的文件夹。首先,您必须以任何方式创建一个 Guid,将“MyExt”名称替换为文件夹的显示名称,将“c:\temp\myext”路径替换为任何物理路径,然后运行此 .bat 文件。

reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000} /ve /t REG_SZ /d "MyExt" /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}\DefaultIcon /ve /t REG_EXPAND_SZ /d %%SystemRoot%%\system32\imageres.dll,-111 /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000} /v System.IsPinnedToNameSpaceTree /t REG_DWORD /d 0x1 /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000} /v SortOrderIndex /t REG_DWORD /d 0x42 /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}\InProcServer32 /ve /t REG_EXPAND_SZ /d %%systemroot%%\system32\shell32.dll /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}\Instance /v CLSID /t REG_SZ /d {0E5AAE11-A475-4c5b-AB00-C66DE400274E} /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}\Instance\InitPropertyBag /v Attributes /t REG_DWORD /d 0x11 /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}\Instance\InitPropertyBag /v TargetFolderPath /t REG_EXPAND_SZ /d "c:\temp\myext" /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}\ShellFolder /v FolderValueFlags /t REG_DWORD /d 0x28 /f
reg add HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}\ShellFolder /v Attributes /t REG_DWORD /d 0xF080004D /f
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{YOURGUID-GOES-HERE-0000-000000000000} /ve /t REG_SZ /d "MyExt" /f
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel /v {YOURGUID-GOES-HERE-0000-000000000000} /t REG_DWORD /d 0x1 /f

请注意,这将为当前用户注册文件夹(因此您不需要在注册表中具有特殊权限),但如果您想为整个机器注册它,您必须将 HKCU 替换为 HKLM(并且那么你需要适当的权利)。

另外请注意,我在 imageres.dll 中选择了一个默认图标,但您当然可以使用其他任何图标。

这是它在 Windows 10 上的样子:


要从窗格中删除文件夹,请创建另一个包含以下内容的 .BAT 文件:

reg delete HKCU\Software\Classes\CLSID\{YOURGUID-GOES-HERE-0000-000000000000}
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{YOURGUID-GOES-HERE-0000-000000000000}
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel

【讨论】:

  • 对Windows 10有任何想法吗?
  • 这不适用于OpenFileDialog(理想情况下,它应该)。是否有任何额外的条目?
  • 好的,是的,应用程序在调用这些对话框时可以使用标志。这些标志可以排除/包含文件夹,具体取决于它们的定义方式(例如,参见 FILEOPENDIALOGOPTIONS::FOS_FORCEFILESYSTEM 或 FOS_ALLNONSTORAGEITEMS)。您无能为力,但是您可以尝试使用 ShellFolder\Attributes 值映射到 msdn.microsoft.com/en-us/library/windows/desktop/bb762589.aspx
  • 注意:这在 Windows 7 上不起作用。例如Dropbox 甚至不会尝试在 Windows 7 上创建此图标。
  • @SimonMourier,你是对的。解决方案是复制代码的前 10 行,并在“Classes”和“CLSID”之间添加“WOW6432Node”的子文件夹。第二组注册表项使该文件夹在 32 位软件中可见。
【解决方案2】:

这是为当前用户添加 Shell 文件夹的 C# 代码。如果您想为本地机器添加它,请将RegistryHive.CurrentUser 更改为RegistryHive.LocalMachine(在这种情况下您需要提升访问权限)。

添加外壳文件夹:

void fnCreateShellFolder(string strGUID, string strFolderTitle, string strTargetFolderPath, string strIconPath)
{
    RegistryKey localKey, keyTemp, rootKey;
    if (Environment.Is64BitOperatingSystem)
        localKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
    else
        localKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);

    rootKey = localKey.CreateSubKey(@"Software\Classes\CLSID\{" + strGUID + "}");
    rootKey.SetValue("", strFolderTitle, RegistryValueKind.String);
    rootKey.SetValue("System.IsPinnedToNameSpaceTree", unchecked((int)0x1), RegistryValueKind.DWord);
    rootKey.SetValue("SortOrderIndex", unchecked((int)0x42), RegistryValueKind.DWord);

    keyTemp = rootKey.CreateSubKey(@"DefaultIcon");
    keyTemp.SetValue("", strIconPath, RegistryValueKind.ExpandString);
    keyTemp.Close();

    keyTemp = rootKey.CreateSubKey(@"InProcServer32");
    keyTemp.SetValue("", @"%systemroot%\system32\shell32.dll", RegistryValueKind.ExpandString);
    keyTemp.Close();

    keyTemp = rootKey.CreateSubKey(@"Instance");
    keyTemp.SetValue("CLSID", "{0E5AAE11-A475-4c5b-AB00-C66DE400274E}", RegistryValueKind.String);
    keyTemp.Close();

    keyTemp = rootKey.CreateSubKey(@"Instance\InitPropertyBag");
    keyTemp.SetValue("Attributes", unchecked((int)0x11), RegistryValueKind.DWord);
    keyTemp.SetValue("TargetFolderPath", strTargetFolderPath, RegistryValueKind.ExpandString);
    keyTemp.Close();

    keyTemp = rootKey.CreateSubKey(@"ShellFolder");
    keyTemp.SetValue("FolderValueFlags", unchecked((int)0x28), RegistryValueKind.DWord);
    keyTemp.SetValue("Attributes", unchecked((int)0xF080004D), RegistryValueKind.DWord);
    keyTemp.Close();
    rootKey.Close();

    keyTemp = localKey.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{" + strGUID + "}");
    keyTemp.SetValue("", strFolderTitle, RegistryValueKind.String);
    keyTemp.Close();

    keyTemp = localKey.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel");
    keyTemp.SetValue("{" + strGUID + "}", unchecked((int)0x1), RegistryValueKind.DWord);
    keyTemp.Close();
}

删除 Shell 文件夹:

static void fnRemoveShellFolder(string strGUID)
{
    RegistryKey localKey;
    if (Environment.Is64BitOperatingSystem)
        localKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
    else
        localKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);

    localKey.DeleteSubKeyTree(@"Software\Classes\CLSID\{" + strGUID + "}", false);
    localKey.DeleteSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{" + strGUID + "}", false);
    localKey.DeleteSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel", false);
}

您可能需要重新启动资源管理器才能看到更改。

// restart explorer
foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())
    if (exe.ProcessName == "explorer")
        exe.Kill();

【讨论】:

  • 我猜这些注册表设置有一些问题。当我调用您的 fnRemoveShellFolder 时,“计算机”、“控制面板”和“用户”等桌面图标也会被删除。甚至他们也没有从“桌面图标设置”中选中。
  • 这需要放入一个库中以作为外壳扩展名调用,以便用户可以右键单击任何文件夹并选择“Pin to Navigation”
【解决方案3】:

我更改了 Mangesh 的一行代码,现在一切正常。因为当我调用 Mangesh 的 fnRemoveShellFolder 时,“计算机”、“控制面板”和“用户”等桌面图标也会被删除。甚至他们也没有从“桌面图标设置”中选中。

localKey.DeleteSubKeyTree(@"Software\Classes\CLSID\{" + GUID + "}", false);
localKey.DeleteSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{" + GUID + "}", false);
tempKey = localKey.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel", true);
tempKey.DeleteValue("{" + GUID + "}", false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多