Pregunta

Mi programa establece el valor "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "Hidden". Hovewer No soy capaz de actualizar el explorador para tener en cuenta este cambio. He intentado:

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); 

Nada funciona. ¿Entonces qué debo hacer? Si restauro el Explorador de mí mismo con F5, entonces funciona. Hovewer me gustaría un poco de solución elegante, por lo que sería actualizar la pantalla en todas partes, incluso en OpenFile / diálogos SaveFile, que son actualmente abierto.

Estoy usando C # .NET, Win7.

Actualización del estado # 1

Como Anders señaló, hay una forma sencilla de actualizar el Explorador de Windows mediante 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();

Así que esta parte está hecho. Hovewer todavía tengo que actualizar los diálogos OpenFile / SaveFile, y el código anterior no hace eso. ¿Alguien sabe cómo actualizar esos diálogos?

Un punto importante es que si cambio la opción "Mostrar archivos ocultos" en Opciones de carpeta en el panel de control, los diálogos OpenFile / SaveFile no se actualizan por el sistema, que debe actualizar manualmente utilizando F5. Estoy en busca de un método de cómo actualizar todos esos diálogos usando C #, por lo que no tenga que pulsar F5 ya ...

Actualización del estado # 2

Ok, por lo nuevo problema con el código anterior - es actualizar no sólo los exploradores de Windows, pero también exploradores de Internet ... ¿Alguna idea de cómo actualizar ventanas exploradores SOLAMENTE

?
¿Fue útil?

Solución

Me descubierto una manera de comprobar si las ventanas era una ventana del Explorador de Windows, y no tienen suficiente cantidad de un representante para agregar un comentario por lo que pensé que lo presento como una respuesta para ayudarle a salir porque ayudó a esta pregunta a salir.

        // 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);
            }
        }

Otros consejos

No sé acerca Abrir /, pero se puede obtener una lista de las ventanas abiertas del explorador con la automatización COM, la objeto Shell.Application tiene un colección de ventanas , o CoCreate IID_IShellWindows directamente, cada ventana en la lista tiene un método de actualización.

WSH / JScript:

for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i)
   sw.Item(i).Refresh();

No sé sobre C #, pero aquí están los ejemplos que se ocupan de la cáscara de Windows en WSH / JScript y c ++

Cuando se instala una aplicación que registra un tipo de archivo, las ventanas del Explorador menudo refrescar para indicar la nueva asociación - podría espiar a la API llama a un instalador que está haciendo para ver cómo se actualiza la ventana

Con Windows 10 después de haber cambiado el nombre de la ventana del explorador:

if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top