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

?
È stato utile?

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top