Come posso aggiornare a livello di codice Esplora risorse?
-
22-07-2019 - |
Domanda
Ho un'estensione della shell di Windows che utilizza IShellIconOverlayIdentifier per visualizzare icone sovrapposte su file e cartelle. La mia estensione è un po 'come TortoiseCVS o TortoiseSVN .
A volte ho bisogno che Windows Explorer ridisegni tutte le sue icone. Per fare questo, chiamo SHChangeNotify in questo modo:
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)
Questo aggiorna il desktop e il riquadro di destra di tutte le finestre di Explorer aperte. Non aggiorna l'albero delle cartelle sul lato sinistro di alcuna finestra di Explorer.
Quindi ho provato a inviare WM_SETTINGCHANGE in questo modo :
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0)
su Vista aggiorna l'albero delle cartelle, ma non il riquadro di destra.
La combinazione di SHChangeNotify ()
seguita da WM_SETTINGCHANGE
sembra funzionare abbastanza bene su Vista. Ma non riesco ancora ad aggiornare l'albero delle cartelle su XP se viene visualizzato.
Qualcuno ha qualche idea su come farlo meglio?
Esiste una soluzione migliore per XP?
Inviare SHCNE_ASSOCCHANGED
è un po 'come clubbing Explorer sopra la testa. Fa sì che l'intero desktop si aggiorni piuttosto violentemente e incassa qualsiasi finestra di Explorer aperta che perde la posizione di scorrimento. C'è qualcosa che è un po 'meno violento?
Soluzione
Qualcuno ha qualche idea su come fare questo meglio?
Personalmente non lo so. Hai citato i programmi Tortoise che fanno una cosa simile, quindi un ottimo punto di partenza sarebbe quello di dare un'occhiata a quello che fanno nella loro fonte :)
Questi sembrano essere i file sorgente rilevanti che gestiscono questo problema:
- TortoiseCVS - ShellUtils.cpp
- TortoiseSVN - ShellUpdater.cpp (nome utente: " guest " ;, password: " ")
Prendo atto del metodo RebuildIcons
in ciascuno di questi:
- imposta la dimensione dell'icona della shell o la profondità del colore su un valore temporaneo
- aggiorna tutte le finestre trasmettendo la modifica delle impostazioni
- reimposta la dimensione dell'icona della shell o l'intensità del colore sul valore originale
- aggiorna tutte le finestre una seconda volta con una trasmissione della modifica delle impostazioni
Forse questo fa parte del trucco per far funzionare le cose in XP.
Altri suggerimenti
Usa spy ++ per vedere quale messaggio WM_COMMMAND viene inviato quando premi F5 in Windows Explorer o scopri quale messaggio di menu viene utilizzato per visualizzare / aggiornare
Quindi utilizza FindWindow per ottenere la finestra di Explorer che desideri e inviare il messaggio WM_COMMAND precedentemente registrato ecc.
Questo è un modo divertente per controllare tutti i tipi di programmi Windows.
Puoi anche inviare un messaggio WM_KEYDOWN con il codice F5 a tutte le finestre di Explorer aperte. Questo è un po 'un trucco però.