Refresh di Windows Explorer in Win7
-
21-09-2019 - |
Domanda
Il mio programma imposta il valore "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
"Hidden"
. Hovewer Io non sono in grado di aggiornare l'Explorer di prendere in considerazione questo cambiamento. Ho provato:
1)
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);`
2)
SHELLSTATE state = new SHELLSTATE();
state.fShowAllObjects = (uint)1;
SHGetSetSettings(ref state, SSF.SSF_SHOWALLOBJECTS, true);
3)
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 5000, ref dwResult);
4)
SendMessage(HWND_BROADCAST, WM_COMMAND, 28931 /* Refresh */, 0);
Niente funziona. Quindi cosa dovrei fare? Se rinfresco Explorer me stesso con F5, allora funziona. Hovewer vorrei qualche soluzione elegante, quindi sarebbe aggiornare la visualizzazione ovunque, anche in OpenFile
/ finestre di dialogo SaveFile
, che sono attualmente aperti.
sto usando C # .NET, Win7.
Stato Aggiornamento # 1
Come Anders
sottolineato, c'è un modo semplice per aggiornare Windows Explorer utilizzando COM:
Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000");
Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true);
dynamic shellApplication = Activator.CreateInstance(shellApplicationType);
dynamic windows = shellApplication.Windows();
for (int i = 0; i < windows.Count; i++)
windows.Item(i).Refresh();
Quindi questa parte è fatto. Hovewer ho ancora bisogno di aggiornare le finestre di dialogo OpenFile
/ SaveFile
, e il codice di cui sopra non lo fa. Qualcuno sa come per aggiornare quelle finestre di dialogo?
Un punto importante è che se cambio "Mostra file nascosti" in Opzioni cartella del Pannello di controllo, queste finestre di dialogo OpenFile
/ SaveFile
non vengono aggiornati dal sistema, li devo aggiornare manualmente con F5. Sto solo cercando un metodo come aggiornare tutte quelle finestre di dialogo utilizzando C #, in modo da non essere necessario premere più F5 ...
Stato Aggiornamento # 2
Ok, così nuovo problema con il codice di cui sopra - è aggiornare non solo le finestre, ma anche esploratori esploratori di Internet ... Qualsiasi idea di come aggiornare Windows esploratori SOLO
?Soluzione
I trovato un modo per controllare se le finestre era una finestra di Esplora risorse, e non hanno abbastanza di un rappresentante per aggiungere un commento così ho pensato presento come una risposta per aiutarvi, perché questa domanda ha aiutato me out.
// based on http://stackoverflow.com/questions/2488727/refresh-windows-explorer-in-win7
Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000");
Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true);
object shellApplication = Activator.CreateInstance(shellApplicationType);
object windows = shellApplicationType.InvokeMember("Windows", System.Reflection.BindingFlags.InvokeMethod, null, shellApplication, new object[] { });
Type windowsType = windows.GetType();
object count = windowsType.InvokeMember("Count", System.Reflection.BindingFlags.GetProperty, null, windows, null);
for (int i = 0; i < (int)count; i++)
{
object item = windowsType.InvokeMember("Item", System.Reflection.BindingFlags.InvokeMethod, null, windows, new object[] { i });
Type itemType = item.GetType();
// only refresh windows explorers
string itemName = (string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null);
if (itemName == "Windows Explorer")
{
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
}
Altri suggerimenti
Non so su Apri / Salva finestre di dialogo, ma è possibile ottenere un elenco di finestre explorer aperte con l'automazione COM, il Shell.Application oggetto ha un collezione di finestre , o CoCreate IID_IShellWindows direttamente, ogni finestra nella lista ha un metodo di aggiornamento.
WSH / JScript:
for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i)
sw.Item(i).Refresh();
Non so su C #, ma qui ci sono esempi che si occupano di finestre della shell in WSH / JScript e C ++
Quando si installa un'applicazione che registra un tipo di file, le finestre di Explorer spesso di aggiornamento per indicare la nuova associazione -? Si potrebbe spiare il chiamate API che un programma di installazione sta facendo vedere come si rinfresca la finestra
Con Windows 10 dopo aver cambiato il nome della finestra di Explorer:
if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}