Как программно добавить папку в избранное пользователя (в проводнике Windows)?
Я ищу способ программно добавить папку в избранное в проводнике 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 ответа
PS: Обязательно ознакомьтесь с решением @bsegraves, которое, я думаю, намного лучше моего.
Я не уверен, что это то, что вы ищете, но я думаю, что любимая папка может быть найдена через следующее значение реестра:
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(..)
метод вызван выше.)
Вместо того, чтобы читать реестр, вы можете сделать следующее:
string favoritesFolder =
Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
Для Windows 8 это местоположение было изменено на%USERPROFILE%\Links. Пожалуйста, обратитесь к этому ответу.
Начиная с 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;