Как я могу программно обновить Проводник Windows?
-
22-07-2019 - |
Вопрос
У меня есть расширение оболочки 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, которые делают то же самое, поэтому отличной отправной точкой было бы взглянуть на то, что они делают в своем исходном коде :)
Похоже, это соответствующие исходные файлы, которые решают эту проблему:
- TortoiseCVS — ShellUtils.cpp
- TortoiseSVN — ShellUpdater.cpp (имя пользователя:«гость», пароль:"")
Я отмечаю в RebuildIcons
метод в каждом из них:
- установите для размера значка оболочки или глубины цвета временное значение
- обновляет все окна, транслируя изменение настроек
- сбрасывает размер значка оболочки или глубину цвета до исходного значения
- обновляет все окна второй раз с трансляцией изменения настроек
Возможно, это часть трюка, позволяющего заставить все работать в XP.
Другие советы
Используйте spy ++, чтобы увидеть, какое сообщение WM_COMMMAND отправляется, когда вы нажимаете F5 в проводнике Windows или находите, какое сообщение меню используется для просмотра / обновления
Затем используйте FindWindow, чтобы получить нужное окно проводника и отправить ему WM_COMMAND, записанное ранее и т. д., сообщение.
Это интересный способ контролировать все виды программ Windows.
Вы также можете отправить сообщение WM_KEYDOWN с кодом клавиши F5 во все открытые окна проводника. Это немного взломать.