Обновить проводник Windows в Win7

Моя программа устанавливает "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" значение "Hidden". Hovewer Я не могу обновить проводника, чтобы учесть это изменение. Я пробовал:

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

Ничего не работает. И что же мне делать? Если я обновляю Explorer самостоятельно с помощью F5, тогда он работает. Hovewer Мне хотелось бы немного элегантного решения, чтобы он обновлял дисплей везде, даже в диалоговом окне OpenFile/SaveFile, которые в настоящее время открыты.

Я использую С#.NET, Win7.

Обновление состояния # 1

Как отмечалось в Anders, существует простой способ обновить окна проводника с помощью 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();

Итак, эта часть выполнена. Hoverwer Мне все еще нужно обновить диалоги OpenFile/SaveFile, а код выше не делает этого. Кто-нибудь знает, как обновить эти диалоги?

Важным моментом является то, что если я изменил "Показать скрытые файлы" в "Параметры папки" на панели управления, эти диалоги OpenFile/SaveFile не будут обновлены системой, я должен обновить их вручную, используя F5. Я просто ищу способ, как обновить все эти диалоги с помощью С#, поэтому мне больше не нужно нажимать F5...

Статус обновления # 2

Хорошо, так что новая проблема с кодом выше - он обновляет не только исследователей Windows, но и интернет-исследователей... Любая идея как обновить Windows Explorer ТОЛЬКО?

Ответы

Ответ 1

Я выяснил, как проверить, были ли окна Windows Explorer, и не хватает комментариев, чтобы добавить комментарий, поэтому подумал, что я отправлю его в качестве ответа, чтобы помочь вам, потому что этот вопрос помог меня.

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

Ответ 2

Я не знаю о диалоговом окне "Открыть/Сохранить", но вы можете получить список открытых окон обозревателя с автоматизацией COM, Shell.Application имеет коллекцию окон или CoCreate IID_IShellWindows напрямую, каждое окно в списке имеет метод обновления.

WSH/JScript:

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

Я не знаю о С#, но вот примеры, касающиеся окон оболочки в WSH/JScript и С++

Ответ 3

Когда вы устанавливаете приложение, которое регистрирует тип файла, окна проводника часто обновляются, чтобы указать новую ассоциацию, - можете ли вы отслеживать вызовы API, которые установщик делает, чтобы увидеть, как он обновляет окно?

Ответ 4

В Windows 10 изменив имя окна проводника:

if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}