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?

Foi útil?

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top