Как я могу программно обновить Windows Explorer?
У меня есть расширение оболочки Windows, которое использует интерфейс IShellIconOverlayIdentifier для отображения оверлейных значков в файлах и папках. Мое расширение немного похоже на TortoiseCVS или TortoiseSVN.
Иногда мне нужно заставить Windows Explorer перерисовать все его значки. Чтобы сделать это, я вызываю 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, чтобы освободить место прокрутки. Есть ли что-то, что немного менее жестоко?
Ответы
Ответ 1
Есть ли у кого-нибудь идеи, как это сделать? это лучше?
Лично я не знаю. Вы упомянули программы Tortoise, которые делают подобную вещь, поэтому отличной отправной точкой было бы посмотреть, что они делают в своем источнике:)
Они выглядят как соответствующие исходные файлы, которые справляются с этой проблемой:
Я отмечаю в методе RebuildIcons
в каждом из них:
- установите размер значка оболочки или глубину цвета во временное значение
- обновляет все окна, передавая изменения настроек
- сбрасывает размер значка оболочки или глубину цвета в исходное значение
- обновляет все окна во второй раз с трансляцией изменения настроек
Возможно, это часть трюка, чтобы заставить все работать в XP.
Ответ 2
Используйте spy ++, чтобы узнать, какое сообщение WM_COMMMAND отправляется, когда вы нажимаете F5 в проводнике Windows или находите, какое сообщение меню используется для просмотра/обновления
Затем используйте FindWindow, чтобы получить окно проводника, которое вы хотите, и отправьте ему сообщение WM_COMMAND ранее и т.д.
Это интересный способ управления всеми видами программ Windows.
Ответ 3
Вы также можете отправить сообщение WM_KEYDOWN с кодовым кодом F5 во все открытые окна проводника. Это немного взломать.