Обновите Windows Explorer в 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); 

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

Я использую.NET C#, 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();

Таким образом, эта часть сделана. Hovewer я все еще должен обновиться OpenFile/SaveFile диалоговые окна и код выше не делают этого. Кто-либо знает, как обновить те диалоговые окна?

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

Обновление статуса № 2

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

16
задан Paya 21 April 2010 в 17:45
поделиться

3 ответа

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

        // 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);
            }
        }
16
ответ дан 30 November 2019 в 22:31
поделиться

Я не знаю о диалогах открытия / сохранения, но вы можете получить список открытых окон проводника с помощью автоматизации 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();

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

2
ответ дан 30 November 2019 в 22:31
поделиться

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

0
ответ дан 30 November 2019 в 22:31
поделиться