Обновить Windows Explorer в Win7 - PullRequest
       17

Обновить Windows Explorer в Win7

16 голосов
/ 22 марта 2010

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

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, то он будет работать. Однако мне бы хотелось какое-нибудь элегантное решение, чтобы оно обновляло отображение везде, даже в OpenFile / SaveFile диалоговых окнах, которые в данный момент открыты.

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

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

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

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

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

Ответы [ 4 ]

16 голосов
/ 19 мая 2010

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

        // based on /2211486/obnovit-windows-explorer-v-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 голосов
/ 24 марта 2010

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

0 голосов
/ 25 мая 2019

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

if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
0 голосов
/ 03 апреля 2010

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

...