Вопрос

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

Иногда мне нужно заставить Проводник 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 это немного похоже на удар дубиной по голове.Это приводит к довольно сильному обновлению всего рабочего стола и к тому, что любые открытые окна проводника теряют позицию прокрутки.Есть ли что-нибудь менее жестокое?

Это было полезно?

Решение

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

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

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

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

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

Возможно, это часть трюка, позволяющего заставить все работать в XP.

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top