2010-07-14 12 views
5

Me gustó mucho la apariencia de oxígeno de KDE SC 4. Escribí un programa para aplicar estos íconos a Windows. El programa está escrito en NSIS, y actualmente es casi completamente funcional. Sin embargo, la única forma que encontré para que Windows tenga conocimiento de los cambios del icono es matar a explorer.exe, eliminar el caché de íconos y reaparecer explorer.exe. SHChangeNotify con SHCNE_ASSOCCHANGED parece ser incapaz de hacer que Windows tenga conocimiento de los cambios en el icono del Panel de control, el ícono de Mi PC, etc. Sugiera un enfoque mejor y menos brutal para que Windows esté al tanto de estos cambios.Make Windows refresh icon cache

EDIT: Encontré un programa llamado Icon Tweaker que parece ser capaz de hacer esto, pero es de código cerrado, así que no tengo idea de cómo lo hace. (IconTweaker: http://www.crystalxp.net/galerie/en.id.83-icontweaker.html)

EDIT: Esto funciona bien, gracias a la respuesta de Anders (ver a continuación). Sin embargo, Voy a poner mi código NSIS trabajo aquí, en caso de que alguien más lo necesita

ReadRegStr $0 HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" 
IntOp $0 $0 + 1 
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0 
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000 
IntOp $0 $0 - 1 
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0 
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000 

El registro $ 0 se utiliza para almacenar el valor de Shell Icon SizeHKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics. A continuación, incrementamos el valor y hacemos un SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL), seguido de una disminución y un nuevo envío.

EDITAR: Como una ventaja, esto se puede utilizar como un truco para obtener iconos de escritorio más grandes (tamaño de Windows 7) en Windows XP. Justo el doble del valor Shell Icon Size y llame SendMessage (no realice el segundo cambio que restaura el tamaño)

+0

Tengo un problema similar en un programa en C#.¿Lo hiciste funcionar? –

+0

Sí. El código que publiqué arriba (código NSIS) fue el truco. –

Respuesta

5

SystemParametersInfo() tiene un parámetro llamado SPI_SETICONS que "vuelve a cargar los iconos del sistema" de acuerdo con MSDN. Nunca he tratado de usar SPI_SETICONS así que no sé si funciona, si se quería probar que usaría algo así como

System::Call 'user32::SystemParametersInfo(i 0x0058,i0,i0,i2)i' ;SPI_SETICONS 

Si resulta que esto no es suficiente, se puede llevar a cabo la gran martillo indocumentado:

  1. Leer valor REG_SZ denominado "Tamaño de la carcasa del icono" en HKEY_CURRENT_USER \ control Panel \ Desktop \ WindowMetrics (Si el valor no está presente, ya sea abortar o uso GetSystemMetrics (SM_CXICON))
  2. restar 1 el número que recibió del paso uno
  3. Escribir la entrada modificada de nuevo al registro
  4. llamada SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)
  5. Escribir el número que obtuvo de paso una entrada posterior al registro
  6. llamada SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)

Tenga en cuenta que esto podría volver a organizar los iconos del escritorio, incluso si "Organización automática" está apagado y posiblemente otras cosas que podrían molestar al usuario!

+1

@Sudarshan S: ReadRegStr, IntOp, WriteRegStr, SendMessage 0xffff 0x001A 42 0/TIMEOUT = 100000 son todos los comandos integrados, System :: Call 'user32 :: GetSystemMetrics (i 11) i.r0' le dará el tamaño SM_CXICON en $ 0 – Anders

4

Usted sólo puede ejecutar la siguiente línea de comandos:

c:\Windows\System32\ie4uinit.exe -ClearIconCache 

ese comando línea eliminará sus iconos de caché sin necesidad de reiniciar el explorador

+0

No estoy seguro de qué hace esto, pero no borra el caché de íconos. – user3690202