Atualizar o Windows Explorer no Win7
-
21-09-2019 - |
Pergunta
Meu programa sets "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
valor "Hidden"
. Hovewer Não sou capaz de atualizar o explorador para levar em consideração essa alteração. Eu tentei:
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. Então, o que eu deveria fazer? Se eu atualizar o explorador com F5, ele funciona. Hovewer eu gostaria de uma solução elegante, para que refresque a tela em todos os lugares, mesmo em OpenFile
/SaveFile
diálogos, que estão atualmente abertos.
Estou usando C# .net, Win7.
Atualização de status #1
Como Anders
apontado, existe uma maneira simples de atualizar o Windows Explorer usando 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();
Então esta parte é feita. Hovewer eu ainda preciso atualizar o OpenFile
/SaveFile
diálogos e o código acima não faz isso. Alguém sabe como atualizar esses diálogos?
Um ponto importante é que, se eu alterar os "Mostrar arquivos ocultos" nas opções de pasta no painel de controle, aquelas OpenFile
/SaveFile
As caixas de diálogo não são atualizadas pelo sistema, devo atualizá -las manualmente usando F5. Estou apenas procurando um método de como atualizar todos esses diálogos usando C#, então não preciso mais pressionar F5 ...
Atualização de status #2
Ok, então novo problema com o código acima - ele atualiza não apenas o Windows Explorers, mas também os exploradores da Internet ... alguma idéia de como atualizar apenas o Windows Explorers?
Solução
Eu descobri uma maneira de verificar se o Windows era uma janela do Windows Explorer e não tenho um representante suficiente para adicionar um comentário, então pensei em enviá -lo como uma resposta para ajudá -lo, porque essa pergunta me ajudou.
// 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);
}
}
Outras dicas
Não sei sobre diálogos de abertura/salvar, mas você pode obter uma lista de janelas do Explorer Open com automação com, o Shell.Application Objeto tem um Coleção de Windows, ou coCreate iid_ishellwindows diretamente, cada janela da lista possui um método de atualização.
WSH/JScript:
for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i)
sw.Item(i).Refresh();
Eu não sei sobre C#, mas aqui estão exemplos que lidam com as janelas da concha em WSH/JScript e C ++
Quando você instala um aplicativo que registra um tipo de arquivo, o Explorer Windows geralmente atualiza para indicar a nova associação - você poderia espionar as chamadas da API que um instalador está fazendo para ver como ela atualiza a janela?
Com o Windows 10 mudou o nome da janela do Explorer:
if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}