c # - Weird Windows 7 desktop ikoner cache

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver en C # -app, der ændrer standard papirkurvikonet på skrivebordet. Jeg gør dette ved at overføre ikonerne til et bestemt sted på drevet og opdatere registreringsdatabasen for at pege på de nye ikoner. Det virker ret godt.


Problemet er imidlertid, at jeg afinstallerer appen og vil sætte ikonerne tilbage som standard. Når jeg tester med den indbyggede funktion i Windows, bemærker jeg, at Windows undertiden ændrer registreringsdatabasen til \%SystemRoot\%System32imageres.dll,50 for tomt ikon og \%SystemRoot\%System32imageres.dll,49 for fuld ikon og nogle gange \%SystemRoot\%System32imageres.dll,-55 for tomt ikon og \%SystemRoot\%System32imageres.dll,-54 for fuld ikon. Jeg kan virkelig ikke finde logikken i nogle gange ved hjælp af 50 og 49 og nogle gange -55 - 54 for standard papirkurv ikon heller ikke kan jeg finde nogen oplysninger om dette problem.


Jeg har også forsøgt at slette ikon cachen i User \ brugernavn \ AppData \ Local uden nogen effekt. Problemet er, at jeg vil sætte standardikonerne tilbage (med f.eks. 50 og 49) vil det ikke opdateres automatisk. Jeg skal manuelt opdatere hver gang for at ændre sin tilstand (tom/fuld). Hvis jeg derefter går til den indbyggede funktion i Windows og sætter tilbage standard ikoner, ændres det til -55 eller -54, hvis jeg brugte 50 og 49, og det virker så. Wtf? Der skal være et andet sted i registreringsdatabasen, som udløser dette .. kan du hjælpe mig?


Stedet i registreringsdatabasen Jeg arbejder med:


HKEY\_CURRENT\_USER
Software
Microsoft
Windows
CurrentVersion
Explorer
CLSID
{645FF040-5081-101B-9F08-00AA002F954E}
DefaultIcon


Rediger 18/04-2011 Efter Anders 'indlæg har jeg fået det her:


[System.Runtime.InteropServices.DllImport("User32.dll")]
public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
[System.Runtime.InteropServices.DllImport("User32.dll")]
public static extern long SendMessageTimeout(int hWnd, int Msg, int wParam, int lParam, int fuFlags, int uTimeout, out int lpdwResult);

private const int SPI\_SETICONS = 0x0058;
private const int SPIF\_UPDATEINIFILE = 0x1;
private const int SPIF\_SENDWININICHANGE = 0x2;
private const int HWND\_BROADCAST = 0xffff;
private const int WM\_SETTINGCHANGE = 0x001A;
private const int SMTO\_ABORTIFHUNG = 0x0002;
private const int SPI\_SETNONCLIENTMETRICS = 0x0002;

        int res = 0;
        RegistryKey iconSizeKey = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop\WindowMetrics", true);
        int iconSize = Int16.Parse((string)iconSizeKey.GetValue("Shell Icon Size"));
        int newIconSize = iconSize - 1;
        iconSizeKey.SetValue("Shell Icon Size", newIconSize, RegistryValueKind.String);
        SendMessageTimeout(HWND\_BROADCAST, WM\_SETTINGCHANGE, SPI\_SETNONCLIENTMETRICS, 0, SMTO\_ABORTIFHUNG, 100000, out res);
        iconSizeKey.SetValue("Shell Icon Size", iconSize, RegistryValueKind.String);
        SendMessageTimeout(HWND\_BROADCAST, WM\_SETTINGCHANGE, SPI\_SETNONCLIENTMETRICS, 0, SMTO\_ABORTIFHUNG, 100000, out res);


Men det ændrer ikke noget :(


Rediger 19/02-2011 Efter Anders 'post Jeg har opdateret dette:


[System.Runtime.InteropServices.DllImport("Shell32.dll")]
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);


Og prøvede alle disse kombinationer:


    SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SHChangeNotify(0x08000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SHChangeNotify(0x00008000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SHChangeNotify(0x00002000, 0x1000, IntPtr.Zero, IntPtr.Zero);


Stadig virker ikke :(

Bedste reference


-55 er en ressource id , 50 er en ressource indeks . Resource id er angivet af udvikleren, indekset er et tal fra 0 (Tællingen kan skifte i en servicepakke osv., Men de er normalt ret stabile). Du kan se ressource id'er med et værktøj som Resource Hacker (Se i ikongruppe for ikon id'er) [11]


Når du vælger et ikon i dialogboksen ikonvalg, bruges indekset normalt. Jeg forventer en bestemt Windows reset-knap for at bruge ressource id ...


Se dette svar for en måde at tvinge et shell-ikon til at opdatere