2010-07-14 11 views
5

Mi è piaciuta molto l'aspetto dell'ossigeno di KDE SC 4. Ho scritto un programma per applicare queste icone a Windows. Il programma è scritto in NSIS ed è attualmente quasi completamente funzionante. Tuttavia, l'unico modo che ho trovato per rendere Windows consapevole delle modifiche alle icone è uccidere explorer.exe, eliminare la cache delle icone e respawn explorer.exe. SHChangeNotify con SHCNE_ASSOCCHANGED sembra essere in grado di rendere Windows consapevole delle modifiche all'icona del Pannello di controllo, l'icona Risorse del computer, ecc. Si prega di suggerire un approccio migliore, meno brutale per rendere Windows consapevole di queste modifiche.Rendi Windows icona cache

EDIT: Ho trovato un programma chiamato Icon Tweaker che sembra essere in grado di farlo, ma è closed source e quindi non ho idea di come lo faccia. (IconTweaker: http://www.crystalxp.net/galerie/en.id.83-icontweaker.html)

MODIFICA: L'ho risolto correttamente, grazie alla risposta di Anders (vedere sotto). Tuttavia, mi limiterò a mettere il mio codice NSIS lavoro qui, nel caso in cui qualcuno ha bisogno altrimenti

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 

Il registro $ 0 è usato per memorizzare il valore di Shell Icon SizeHKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics. Quindi incrementiamo il valore e facciamo un SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL), seguito da un decremento e re-invio.

MODIFICA: Come bonus, questo può essere usato come un trucco per ingrandire le icone del desktop (Windows 7) su Windows XP. Basta raddoppiare il valore Shell Icon Size e chiamare SendMessage (non eseguire la seconda cambiamento che ripristina la dimensione)

+0

Ho un problema simile in un programma C#.Hai funzionato? –

+0

Sì. Il codice che ho postato sopra (codice NSIS) ha fatto il trucco. –

risposta

5

SystemParametersInfo() ha un parametro chiamato SPI_SETICONS che "ricarica le icone di sistema", secondo MSDN. Non ho mai cercato di usare SPI_SETICONS quindi non so se funziona, se si voleva mettere alla prova si può usare qualcosa di simile

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

Se si scopre che questo non è sufficiente, è possibile mettere in evidenza il grande martello senza documenti:

  1. valore Leggi REG_SZ denominato "Shell Icon Size" in HKEY_CURRENT_USER \ Control Panel \ Desktop \ WindowMetrics (Se il valore non c'è, o interrompere o utilizzare GetSystemMetrics (SM_CXICON))
  2. sottrarre 1 dal il numero che hai ottenuto dal primo passaggio
  3. Scrivi la voce modificata di nuovo al Registro
  4. chiamata SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)
  5. Scrivi il numero che hai dal punto una voce indietro al Registro di sistema
  6. chiamata SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)

si noti che questo potrebbe ri-organizzare le icone del desktop anche se "Disposizione automatica" è fuori e, eventualmente, altre cose che potrebbero infastidire l'utente!

+1

@Sudarshan S: ReadRegStr, IntOp, WriteRegStr, SendMessage 0xffff 0x001A 42 0/TIMEOUT = 100000 sono tutti comandi incorporati, System :: Call 'user32 :: GetSystemMetrics (i 11) i.r0' fornirà la dimensione SM_CXICON in $ 0 – Anders

4

si può semplicemente eseguire la seguente riga di comando:

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

Quella riga di comando cancellerà le icone di cache senza bisogno di riavviare explorer

+0

Non so cosa faccia, ma non cancella la cache delle icone. – user3690202