2013-05-24 4 views
1

У меня есть приложение, которое работает странно: процесс настройки копирует файлы в временную папку, затем проверяет несколько вещей, и если все в порядке, перемещает файлы в конечную папку.Значки меню «Обновить начало» в Windows 8

Проблема в том, что установщик создает ярлыки перед перемещением файлов.

В результате, в стартовом меню (один с плитами) значок является «сортировкой по умолчанию».

In the start menu

Я пытался заставить обновление системы с использованием this link (трансляция сообщение WM_SETTINGCHANGE), но это не похоже на работу для меню Пуск Windows 8.

Даже перезагрузка ОС, похоже, не обновляет иконку, единственное, что работает, - это переустановить мягкую поверх нее.

Как я могу принудительно обновить значки для меню запуска Win8?

Благодаря

ответ

3

Во-первых, вы не говорите нам, почему ваш процесс установки должен работать так, что она делает. Я согласен, что это странно, но я полагаю, у вас есть веская причина для этого. Если нет, я предлагаю начать с этого места и исправить установщика, а не помещать бандажи на отдельные проблемы. Позднее вам придется столкнуться с другими проблемами, и исправление корней будет намного проще и проще в обслуживании, чем пучок ленточных средств.

В любом случае, если вы должны спуститесь по этому пути & 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» в списке.

Я только что испытал это, и он работает; эффект мгновен.

+0

Благодарим вас за подробный ответ. Это устаревший скрипт установки, и у нас нет бюджета и желания рискнуть изменить его. Если бы это было только для меня, я бы уже переписал его, но мне не разрешено. Я попробую ваше предложение в понедельник и посмотрю, как это происходит. Спасибо ! – thomasb

Смежные вопросы