Во-первых, вы не говорите нам, почему ваш процесс установки должен работать так, что она делает. Я согласен, что это странно, но я полагаю, у вас есть веская причина для этого. Если нет, я предлагаю начать с этого места и исправить установщика, а не помещать бандажи на отдельные проблемы. Позднее вам придется столкнуться с другими проблемами, и исправление корней будет намного проще и проще в обслуживании, чем пучок ленточных средств.
В любом случае, если вы должны спуститесь по этому пути & hellip; Причина, по которой передача сообщения WM_SETTINGCHANGE
не работает, заключается в том, что это не имеет ничего общего с значками. Они управляются отдельно Explorer и не восстанавливаются, если вы не удалите кеш-память. Это, естественно, побуждает его перестроить его. Это общий метод устранения неполадок для конечных пользователей, но это не то, что вы хотите делать программно. Поговорите об уродливом взломе. И изменение глобального состояния для решения локальной проблемы.
Кроме того, если перезагрузка ОС не работает, вы знаете, что это не так просто, как вы заставляете ее звучать в вашем вопросе: свойство, нуждающееся в обновлении . Причина, по которой переустановка поверх существующей установки работает, связана с тем, что, когда ярлык создается в начале, его целевой исполняемый файл уже существует в ожидаемом месте (помещенном предыдущей установкой) с допустимым значком.
Что я рекомендую делать, это написать код для изменения значка существующего ярлыка. Убедитесь, что вы его выполнили после, вы скопировали исполняемый файл в конечный пункт назначения. Метод, который позволяет вам это сделать, - IShellLink::SetIconLocation
, который принимает два параметра: путь к значку (это будет путь к исполняемому файлу) и индекс значка (это, вероятно, будет 0, если вы хотите, чтобы значок был want - это первый и единственный, содержащийся в исполняемом файле).
Конечно, для того чтобы позвонить SetIconLocation
, вам нужно будет получить объект, представляющий ваш ярлык, который реализует IShellLink
. Это COM-интерфейс, который, как я полагаю, не привязан .NET Framework. Общая информация о создании ярлыков из C# доступна в ответах на this question. Более конкретно, есть ссылка на this wrapper class, которую вы можете использовать, чтобы выполнить большую часть грязной работы. Я не думаю, что он содержит метод установки/изменения значка, но это может быть добавлено тривиально.
В качестве альтернативы вы можете получить эти же свойства с помощью оболочки Windows Scripting Host (WSH), WshShortcut
. Он имеет свойство IconLocation
, которое работает по-разному, за исключением того, что он принимает только один строковый аргумент, с индексом, ограниченным от пути запятой: myApp.exe, 0
. Это не особенно хорошо документировано (лучше всего я могу найти), но чтобы получить существующий ярлык, вы просто используете метод CreateShortcut
и указываете путь к существующему ярлыку. Например:
public void SetShortcutIcon(string shortcutPath, string iconPath, int iconIndex)
{
// Note: no error checking is performed for the parameters!
// This is not production-ready code!
// If a shortcut does not exist at the specified path, you should
// create a new one instead.
// If iconPath does not specify a valid executable file, you should
// set a default icon or perhaps abort.
IWshRuntimeLibrary.WshShell wsh = new IWshRuntimeLibrary.WshShell();
IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut(shortcutPath);
shortcut.IconLocation = String.Format("{0}, {1}", iconPath, iconIndex);
shortcut.Save();
}
Обратите внимание, что для того, чтобы приведенный выше код для компиляции, вам также необходимо добавить ссылку на хост-объектной модели Windows Script для вашего приложения. Для этого щелкните правой кнопкой мыши по папке «Ссылки» в обозревателе решений, откройте вкладку «COM» и найдите «Объектная модель хоста Windows Script» в списке.
Я только что испытал это, и он работает; эффект мгновен.
Благодарим вас за подробный ответ. Это устаревший скрипт установки, и у нас нет бюджета и желания рискнуть изменить его. Если бы это было только для меня, я бы уже переписал его, но мне не разрешено. Я попробую ваше предложение в понедельник и посмотрю, как это происходит. Спасибо ! – thomasb