Как программно обновить Проводник Windows?
у меня есть расширение оболочки Windows, которое использует IShellIconOverlayIdentifier интерфейс для отображения значков наложения на файлы и папки. Мое расширение немного похоже на TortoiseCVS или в TortoiseSVN.
иногда мне нужно сделать Проводник Windows перерисовать все это значки. Для этого я призываю SHChangeNotify такой:
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)
это обновляет рабочий стол и правую панель любого открытого окна Проводника. Он не обновляет дерево папок в левой части окон Проводника.
поэтому я попытался отправить WM_SETTINGCHANGE такой:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0)
в Vista это обновляет дерево папок,но не правую панель.
сочетание SHChangeNotify()
следовал по WM_SETTINGCHANGE
кажется, работает довольно хорошо на Vista. Но я все еще не могу обновить дерево папок на XP, если она отображается.
есть ли у кого-нибудь идеи, как это сделать лучше?
есть ли лучшее решение для XP?
отправка SHCNE_ASSOCCHANGED
это немного похоже на дубинку Explorer над головой. Это заставляет весь рабочий стол обновляться довольно сильно и приводит к тому, что любые открытые окна Проводника теряют положение прокрутки. Есть что - нибудь менее жестокое?
3 ответов
есть ли у кого-нибудь идеи, как это сделать так лучше?
лично я не знаю. Вы упоминаете программы Tortoise, которые делают аналогичную вещь, поэтому отличной отправной точкой было бы посмотреть, что они делают в своем источнике:)
Они выглядят как соответствующие исходные файлы, которые обрабатывают эту проблему:
- TortoiseCVS - ShellUtils.cpp
- в TortoiseSVN - Шеллупдейтер.cpp (имя пользователя: "гость", пароль: "")
Я отмечаю в RebuildIcons
метод в каждом из них будут:
- установите размер значка оболочки или глубину цвета на временное значение
- обновляет все окна, транслируя изменение настроек
- сбрасывает размер значка оболочки или глубину цвета до исходного значения
- обновляет все окна во второй раз с трансляцией настройки изменить
возможно, это часть трюка, чтобы заставить вещи работать в XP.
используйте spy++, чтобы узнать, какое сообщение WM_COMMAND отправляется при нажатии F5 в проводнике windows или найти, какое сообщение меню используется для просмотра/обновления
затем используйте FindWindow, чтобы получить нужное окно Проводника и отправить ему сообщение WM_COMMAND, записанное ранее и т. д.
Это интересный способ управления всеми видами программ Windows.
вы также можете отправить сообщение WM_KEYDOWN с кодом ключа F5 во все открытые окна Проводника. Это немного Хак, хотя.