Программно изменить значок исполняемого файла
Я разрабатываю приложение под названием WeatherBar. Его основная функциональность основана на ее взаимодействии с панелью задач Windows 7 - она меняет значок в зависимости от погодных условий в определенном месте.
Значки, которые я использую в приложении, хранятся в скомпилированном файле ресурсов (.res). Я использую его вместо встроенного манифеста ресурса только для значков. По умолчанию я изменяю свойство Icon основной формы, чтобы соответствующим образом менять значки, и она работает нормально, если значок не прикреплен к панели задач. Когда он закрепляется, значок на панели задач автоматически переключается на стандартную для исполняемого файла (с индексом 0 в файле ресурсов).
После небольшого исследования я понял, что способ изменения значка изменит значок ярлыка (поскольку все закрепленные приложения на самом деле являются ярлыками, хранящимися в папке пользователя). Но это не сработало.
Я предполагаю, что мне нужно изменить значок исполняемого файла и, следовательно, использовать UpdateResource
, но я не совсем уверен в этом. Мой исполняемый файл не имеет цифровой подписи, поэтому не следует изменять его.
Каким будет способ решить эту проблему?
Ответы
Ответ 1
Если вы хотите сделать это программно, я хотел бы начать с просмотра Portable Executable file format (Запись в Википедии). Раздел ресурсов (.rsrc, см. Раздел 6.9) должен содержать значок. Используя эту информацию, вы можете написать инструмент для изменения значка.
Если вы просто хотите быстро изменить значок в существующем файле, вы можете взломать его в редакторе ресурсов Visual Studio. Я проверил это с файлом, удалив старый значок и добавив новый. Иконка .exe изменилась в Проводнике на новый значок, и новый значок появился в меню "Пуск", когда я перетащил его туда.
- Изменить -
Да, я согласен, что использование UpdateResource - хороший подход. Вот пример, который я нашел для использования функций С++ для этого, и подписи P/Invoke для UpdateResource и FindResource.
Ответ 2
private void button1_Click(object sender, EventArgs e)
{
String path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
String name = "test";
Shell32.Shell shl = new Shell32.ShellClass();
// Optional code to create the shortcut
System.IO.StreamWriter sw = new System.IO.StreamWriter(path + @"\" + name + ".lnk", false);
sw.Close();
// End optional code
Shell32.Folder dir = shl.NameSpace(path);
Shell32.FolderItem itm = dir.Items().Item(name + ".lnk");
Shell32.ShellLinkObject lnk = (Shell32.ShellLinkObject)itm.GetLink;
// Optional code to create the shortcut
lnk.Path = Environment.GetFolderPath(Environment.SpecialFolder.System)
+ @"\notepad.exe";
lnk.Description = "nobugz was here";
lnk.Arguments = @"c:\sample.txt";
lnk.WorkingDirectory = @"c:\";
// End optional code
lnk.SetIconLocation(Environment.GetFolderPath(Environment.SpecialFolder.System)
+ "cmd.exe", 1);
lnk.Save(null);
}
Это было взято из http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/9e23a82c-8bed-4b96-8b9a-4c2b6136a622/
Это может помочь.
Ответ 3
Я решил реализовать обходной путь - значок изменится в миниатюре для окна (это возможно в Windows 7). Если значок отключен, пользователь может увидеть изменение значка. Если он закреплен, миниатюра изменится в соответствии с текущими погодными условиями.
Мне кажется, что структура закрепленных значков (на самом деле ярлык) не позволяет изменять динамическую иконку. Если я ошибаюсь, я открыт для комментариев и идей по этому поводу.