c# - two - Actualizar el Explorador de Windows en Win7
windows 10 icons have 2 blue arrows (3)
Mi programa configura "HKCU/Software/Microsoft/Windows/CurrentVersion/Explorer/Advanced"
valor "Hidden"
. Hovewer no puedo 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 actualizo el Explorer con F5, entonces funciona. Hovewer Me gustaría una solución elegante, por lo que actualizaría la pantalla en todas partes, incluso en los cuadros de diálogo de OpenFile
/ SaveFile
, que están actualmente abiertos.
Estoy usando C # .NET, Win7.
Actualización de estado # 1
Como señaló Anders
, hay una forma sencilla de actualizar las ventanas del explorador utilizando 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á hecha. Hovewer Todavía necesito actualizar los cuadros de diálogo de OpenFile
/ SaveFile
, y el código anterior no lo hace. ¿Alguien sabe cómo actualizar esos diálogos?
Un punto importante es que si cambio "Mostrar archivos ocultos" en Opciones de carpeta en el Panel de control, el sistema no actualiza SaveFile
cuadros de diálogo SaveFile
OpenFile
/ SaveFile
, debo actualizarlos manualmente con F5. Solo estoy buscando un método para actualizar todos esos diálogos usando C #, así que ya no necesito presionar F5 ...
Actualización de estado # 2
Bien, entonces hay un nuevo problema con el código anterior: no solo actualiza Windows Explorer, sino también Internet Explorer ... ¿Alguna idea de cómo actualizar SOLO Windows Explorer?
Cuando instala una aplicación que registra un tipo de archivo, las ventanas de Explorer a menudo se actualizan para indicar la nueva asociación. ¿Podría espiar las llamadas a la API que realiza un instalador para ver cómo se actualiza la ventana?
Descubrí una forma de comprobar si Windows era una ventana del Explorador de Windows, y no tengo suficiente representante para agregar un comentario, así que pensé que lo enviaría como una respuesta para ayudarte porque esta pregunta me ayudó.
// based on http://.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);
}
}
No sé acerca de los diálogos Abrir / Guardar, pero puede obtener una lista de ventanas abiertas del explorador con automatización COM, el objeto Shell.Application tiene una 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é acerca de C #, pero aquí hay ejemplos relacionados con ventanas de shell en WSH/JScript y c++