Как программно добавить папку в избранное пользователя (в проводнике Windows)? - PullRequest
2 голосов
/ 25 ноября 2010

Я ищу способ программно добавить папку в избранное в проводнике Windows. Его Windows Explorer специфичен и основан на этом проекте: http://www.codeproject.com/Tips/132804/Open-folders-using-a-Run-Command

До сих пор я пробовал Process Monitor и осуществлял поиск в реестре, но мне не удается найти избранное Windows Explorer в regedit.


Microsoft изменила это в Windows 8, поэтому я пометил свой вопрос соответствующим образом. Пожалуйста, смотрите комментарии в помеченном ответе для Win8 и др. Подробности.

Ответы [ 4 ]

6 голосов
/ 21 сентября 2011

Вместо чтения реестра вы можете сделать следующее:

string favoritesFolder = 
    Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
4 голосов
/ 25 ноября 2010

PS: Обязательно ознакомьтесь с решением @ bsegraves , которое, я думаю, намного лучше моего.

I 'Я не уверен, что это то, что вы ищете, но я думаю, что любимая папка может быть найдена через следующее значение реестра:

HKEY_CURRENT_USER\
  Software\
    Microsoft\
      Windows\
        CurrentVersion\
          Explorer\
            User Shell Folders\
              Favorites

Вы сможете получить имя этой папки с помощью следующего кода:

using Microsoft.Win32;
...

RegistryKey topLevel = Registry.CurrentUser;
RegistryKey key = topLevel.OpenSubKey(
    @"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders",
    true);

string favoriteFolder = key.GetValue("Favorites").ToString();

Тогда нужно только создать ссылку или документ в указанной папке.

(Обратите внимание, что значение этого ключа может быть примерно таким: %USERPROFILE%\Favorites;Переменная окружения должна автоматически расширяться с помощью метода .GetValue(..), вызванного выше.)

3 голосов
/ 20 мая 2013

Для Windows 8 это местоположение было изменено на% USERPROFILE% \ Links.Пожалуйста, обратитесь к этот ответ .

0 голосов
/ 13 декабря 2014

Начиная с Vista было добавлено const FOLDERID_Links.Это указывает на Избранное проводника Windows.Мой код (Delphi, но основная идея видна):

procedure AddFileObjectToFavorites(AParent: HWND; const AObjectFileName: UnicodeString);

  function GetFavorites: PItemIDList;
  begin
    if IsWindowsVistaOrLater then
      OleCheck(SHGetKnownFolderIDList(FOLDERID_Links, 0, 0, Result))
    else
      OleCheck(SHGetFolderLocation(AParent, CSIDL_FAVORITES, 0, 0, Result));
  end;

var
  Desktop: IShellFolder;
  Eaten: DWORD;
  Attr: DWORD;
  ObjectIDList: PItemIDList;
  ObjectParentFolder: IShellFolder;
  ObjectChildIDList: PItemIDList;
  LinksIDList: PItemIDList;
  LinksParentFolder: IShellFolder;
  LinksChildIDList: PItemIDList;
  DataObject: IDataObject;
  LinksDropTarget: IDropTarget;
  Effect: Integer;
begin
  OleCheck(SHGetDesktopFolder(Desktop));
  try
    Attr := 0;
    OleCheck(Desktop.ParseDisplayName(AParent, nil, PWideChar(AObjectFileName), Eaten, ObjectIDList, Attr));
    try
      SHBindToParent(ObjectIDList, IShellFolder, Pointer(ObjectParentFolder), ObjectChildIDList);
      try
        LinksIDList := GetFavorites;
        try
          OleCheck(SHBindToParent(LinksIDList, IShellFolder, Pointer(LinksParentFolder), LinksChildIDList));
          try
            OleCheck(LinksParentFolder.GetUIObjectOf(AParent, 1, LinksChildIDList, IDropTarget, nil, LinksDropTarget));
            try
              OleCheck(ObjectParentFolder.GetUIObjectOf(AParent, 1, ObjectChildIDList, IDataObject, nil, DataObject));
              try
                Effect := DROPEFFECT_LINK;
                OleCheck(LinksDropTarget.DragEnter(DataObject, 0, Point(0, 0), Effect));
                if Effect and DROPEFFECT_LINK = 0 then
                  begin
                    OleCheck(LinksDropTarget.DragLeave);
                    raise Exception.Create('Cannot drop');
                  end;
                Effect := DROPEFFECT_LINK;
                OleCheck(LinksDropTarget.Drop(DataObject, 0, Point(0, 0), Effect));
              finally
                DataObject := nil;
              end;
            finally
              LinksDropTarget := nil;
            end;
          finally
            LinksParentFolder := nil;
          end;
        finally
          CoTaskMemFree(LinksIDList);
        end;
      finally
        ObjectParentFolder := nil;
      end;
    finally
      CoTaskMemFree(ObjectIDList);
    end;
  finally
    Desktop := nil;
  end;
end;
...