Подтвердить что ты не робот

Как я могу программно обновить 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, чтобы освободить место прокрутки. Есть ли что-то, что немного менее жестоко?

4b9b3361

Ответ 1

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

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

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

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

  • установите размер значка оболочки или глубину цвета во временное значение
  • обновляет все окна, передавая изменения настроек
  • сбрасывает размер значка оболочки или глубину цвета в исходное значение
  • обновляет все окна во второй раз с трансляцией изменения настроек

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

Ответ 2

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

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

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

Ответ 3

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