Как программно обновить Windows Explorer? - PullRequest
21 голосов
/ 15 марта 2009

У меня есть расширение оболочки Windows, которое использует IShellIconOverlayIdentifier интерфейс для отображения значков наложения на файлы и папки. Мое расширение немного похоже на TortoiseCVS или TortoiseSVN .

Иногда мне нужно заставить Windows Explorer перерисовать все его иконки. Для этого я вызываю SHChangeNotify , например:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)

Это обновляет рабочий стол и правую панель любых открытых окон проводника. Он не обновляет дерево папок в левой части окон Windows.

Итак, я попытался отправить WM_SETTINGCHANGE так:

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0) 

в Vista обновляет дерево папок, но не правую панель.

Комбинация SHChangeNotify() с последующим WM_SETTINGCHANGE, похоже, очень хорошо работает в Vista. Но я все еще не могу обновить дерево папок в XP, если оно отображается.

У кого-нибудь есть идеи, как сделать это лучше?

Есть ли лучшее решение для XP?

Отправка SHCNE_ASSOCCHANGED немного похожа на клубного Исследователя над головой. Это заставляет весь рабочий стол довольно сильно обновляться и приводит к тому, что любые открытые окна Проводника теряют позицию прокрутки. Есть что-нибудь менее насильственное?

Ответы [ 3 ]

7 голосов
/ 15 марта 2009

У кого-нибудь есть идеи, как это сделать? это лучше?

Лично я не знаю. Вы упоминаете о программах «Черепаха», которые делают аналогичные вещи, поэтому отличной отправной точкой было бы посмотреть, что они делают в своем источнике:)

Похоже, что это соответствующие исходные файлы, которые решают эту проблему:

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

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

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

0 голосов
/ 01 мая 2013

Вы также можете отправить сообщение WM_KEYDOWN с кодом клавиши F5 во все открытые окна проводника. Это немного взломать.

0 голосов
/ 15 марта 2009

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

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

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

...