Reputation: 682
I am changing the folder icons with c# function. Its working fine but the problem is its working for first time. I mean I am not able to change the icon for the folder for which I have changed the icon already. Here is the code below:
static void Main(string[] args)
{
LPSHFOLDERCUSTOMSETTINGS FolderSettings = new LPSHFOLDERCUSTOMSETTINGS();
FolderSettings.dwMask = 0x10;
FolderSettings.pszIconFile = @"C:\Program Files (x86)\Common Files\TortoiseOverlays\icons\XPStyle\ModifiedIcon.ico";
FolderSettings.iIconIndex = 0;
UInt32 FCS_READ = 0x00000001;
UInt32 FCS_FORCEWRITE = 0x00000002;
UInt32 FCS_WRITE = FCS_READ | FCS_FORCEWRITE;
string pszPath = @"D:\Downloaded Data";
UInt32 HRESULT = SHGetSetFolderCustomSettings(ref FolderSettings, pszPath, FCS_WRITE);
//Console.WriteLine(HRESULT.ToString("x"));
//Console.ReadLine();
}
[DllImport("Shell32.dll", CharSet = CharSet.Auto)]
static extern UInt32 SHGetSetFolderCustomSettings(ref LPSHFOLDERCUSTOMSETTINGS pfcs, string pszPath, UInt32 dwReadWrite);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct LPSHFOLDERCUSTOMSETTINGS
{
public UInt32 dwSize;
public UInt32 dwMask;
public IntPtr pvid;
public string pszWebViewTemplate;
public UInt32 cchWebViewTemplate;
public string pszWebViewTemplateVersion;
public string pszInfoTip;
public UInt32 cchInfoTip;
public IntPtr pclsid;
public UInt32 dwFlags;
public string pszIconFile;
public UInt32 cchIconFile;
public int iIconIndex;
public string pszLogo;
public UInt32 cchLogo;
}
What could be the reason?
Upvotes: 6
Views: 5817
Reputation: 31
Just change
UInt32 FCS_WRITE = FCS_READ | FCS_FORCEWRITE;
to
UInt32 FCS_WRITE = FCS_FORCEWRITE;
When you run next time the FCS_WRITE = FCS_READ, so it wont write agian.
Upvotes: 3
Reputation: 11
Just for completion, the code in question looks OK, but the 3rd param in the SHGetSetFolderCustomSettings call must be FCS_FORCEWRITE in order to change the settings if already present. (FCS_WRITE will set it ONLY if values NOT already present)
See docs about that parameter: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762199(v=vs.85).aspx
Upvotes: 1
Reputation: 734
I've faced with similar issue. Just remove the desktop.ini file before calling the function for the second time. The same scenario is used if you would like to clear folder icon:
....
FolderSettings.pszIconFile = @"{icon path}";
FolderSettings.iIconIndex = 0;
....
Upvotes: 4