Hej alle,
Jeg er pt. i gang med at udvikle en meget simpel C# applikation. Det eneste den skal kunne er at skifte ikonet for den indbyggede papirskurv. At skifte ikonet til mit eget ikon og tilbage igen ved at ændre i registry er intet problem. Problemet er at når jeg har skiftet tilbage til standard-ikonet så "hænger" ikonet en smule. Den skifter fint ikonet tilbage, men når jeg fx. smider noget i papirskurven og den derfor gerne skulle vise den fulde papirskurv bliver den ikke opdateret. Kun hvis jeg højre-klikker->opdater. Jeg har prøvet alt lige fra at slette icon-cache, bruge SendMessageTimeout og SHChangeNotify med alle mulige kombinationer, men intet virker. Lige nu har jeg følgende:
- [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);
- [System.Runtime.InteropServices.DllImport("Shell32.dll")]
- private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
-
- 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;
-
- SystemParametersInfo(SPI_SETICONS, 0, null, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
-
- 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);
-
- 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);
Koden opdaterer skrivebordet fint, men så snart papirskurven skal skifte "state" altså ved at jeg smider noget i papirskurven eller tømrer den sker der intet før jeg højre-klikker->opdater.
PS: Tester på Win7.
Kan i hjælpe? På forhånd tak!