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

Они выглядят как соответствующие исходные файлы, которые обрабатывают эту проблему:

Я отмечаю в RebuildIcons метод в каждом из них будут:

  1. установите размер значка оболочки или глубину цвета на временное значение
  2. обновляет все окна, транслируя изменение настроек
  3. сбрасывает размер значка оболочки или глубину цвета до исходного значения
  4. обновляет все окна во второй раз с трансляцией настройки изменить

возможно, это часть трюка, чтобы заставить вещи работать в XP.


используйте spy++, чтобы узнать, какое сообщение WM_COMMAND отправляется при нажатии F5 в проводнике windows или найти, какое сообщение меню используется для просмотра/обновления

затем используйте FindWindow, чтобы получить нужное окно Проводника и отправить ему сообщение WM_COMMAND, записанное ранее и т. д.

Это интересный способ управления всеми видами программ Windows.


вы также можете отправить сообщение WM_KEYDOWN с кодом ключа F5 во все открытые окна Проводника. Это немного Хак, хотя.