Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Смена иконки папки в Висте [D7, WinXP]


Tahion2 ©   (2007-11-13 15:05:00) 

Как программно сменить иконку папки _в висте_?

 Способ, который работал в Windows XP и более ранних системах
 (записать данные о иконке в desktop.ini и обновить кэш) в висте не
 работают. Точнее работают, но только для папки, для которой иконка
 ДО ЭТОГО не менялась. Если иконка папке уже была присвоена, то
 сменить не удается.

 Any Ideas?


Lacmus   (2007-11-22 16:59:00) [1]



uses
 ActiveX, ShlObj;

const
 FCS_READ        = $00000001;
 FCS_FORCEWRITE  = $00000002;
 FCS_WRITE       = (FCS_READ or FCS_FORCEWRITE);

 FCS_FLAG_DRAGDROP = 2;

 FCSM_VIEWID          = $00000001;
 FCSM_WEBVIEWTEMPLATE = $00000002;
 FCSM_INFOTIP         = $00000004;
 FCSM_CLSID           = $00000008;
 FCSM_ICONFILE        = $00000010;
 FCSM_LOGO            = $00000020;
 FCSM_FLAGS           = $00000040;

type
 SHFOLDERCUSTOMSETTINGSW = record
   dwSize : dword;
   dwMask : dword;             // IN/OUT   Which Attributes to Get/Set
   pvid : PSHELLVIEWID;               // OUT - if dwReadWrite is FCS_READ, IN - otherwise
   // The folder's WebView template path
   pszWebViewTemplate : LPWSTR;  // OUT - if dwReadWrite is FCS_READ, IN - otherwise
   cchWebViewTemplate : DWORD;  // IN - Specifies the size of the buffer pointed to by pszWebViewTemplate
                               // Ignored if dwReadWrite is FCS_READ
   pszWebViewTemplateVersion : LPWSTR;  // currently IN only
   // Infotip for the folder
   pszInfoTip : LPWSTR;         // OUT - if dwReadWrite is FCS_READ, IN - otherwise
   cchInfoTip : DWORD;         // IN - Specifies the size of the buffer pointed to by pszInfoTip
                               // Ignored if dwReadWrite is FCS_READ
   // CLSID that points to more info in the registry
   pclsid : PCLSID;             // OUT - if dwReadWrite is FCS_READ, IN - otherwise
   // Other flags for the folder. Takes FCS_FLAG_* values
   dwFlags : DWORD;            // OUT - if dwReadWrite is FCS_READ, IN - otherwise

   pszIconFile : LPWSTR;        // OUT - if dwReadWrite is FCS_READ, IN - otherwise
   cchIconFile : DWORD;        // IN - Specifies the size of the buffer pointed to by pszIconFile
                               // Ignored if dwReadWrite is FCS_READ

   iIconIndex : integer;         // OUT - if dwReadWrite is FCS_READ, IN - otherwise

   pszLogo : LPWSTR;        // OUT - if dwReadWrite is FCS_READ, IN - otherwise
   cchLogo : DWORD;        // IN - Specifies the size of the buffer pointed to by pszIconFile
                           // Ignored if dwReadWrite is FCS_READ
 end;
 LPSHFOLDERCUSTOMSETTINGSW = ^SHFOLDERCUSTOMSETTINGSW;
 TShFolderCustomSettingsW = SHFOLDERCUSTOMSETTINGSW;
 PShFolderCustomSettingsW = LPSHFOLDERCUSTOMSETTINGSW;

function SHGetSetFolderCustomSettingsW(pfcs : PSHFOLDERCUSTOMSETTINGSW;
 pszPath : LPCWSTR; dwReadWrite : DWORD) : HResult; stdcall; external 'shell32.dll';

procedure SHSetFolderIcon(const aDirectory, aIconFile: WideString);
var
 ShFolderCustomSettingsW: TShFolderCustomSettingsW;
begin
 FillChar(ShFolderCustomSettingsW, SizeOf(ShFolderCustomSettingsW), 0);
 ShFolderCustomSettingsW.dwSize := SizeOf(ShFolderCustomSettingsW);
 ShFolderCustomSettingsW.dwMask := FCSM_ICONFILE;
 ShFolderCustomSettingsW.pszIconFile := PWideChar(aIconFile);
 SHGetSetFolderCustomSettingsW(@ShFolderCustomSettingsW, PWideChar(aDirectory), FCS_WRITE);
 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST or SHCNF_FLUSHNOWAIT, nil, nil)
end;


Tahion2   (2007-11-19 01:29:00) [2]

А можно какой-то пример увидеть?


Lacmus   (2007-11-16 13:14:00) [3]

SHGetSetFolderCustomSettings ?

IconResource в desktop.ini ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо