Программно измените значок исполняемого файла

Я разрабатываю приложение под названием WeatherBar. Его основная функциональность основана на его взаимодействии с панелью задач Windows 7 — она изменяет значок в зависимости от погодных условий в определенном месте.

Значки, которые я использую в приложении, все хранятся в скомпилированном собственном файле ресурсов (.res) — я использую его вместо встроенной декларации ресурса для значков только. По умолчанию я изменяю свойство Icon основной формы для изменения значков соответственно, и это хорошо работает, пока значок не прикрепляется к панели задач. Когда это прикрепляется, значок в панели задач автоматически переключается на по умолчанию для исполняемого файла (с индексом 0 в файле ресурсов).

После выполнения определенного исследования я полагал, что способ изменить значок будет изменять ярлык (поскольку все прикрепленные приложения являются на самом деле ярлыками, сохраненными в пользовательской папке). Но это не работало.

Я предполагаю, что должен изменить значок для исполняемого файла, и поэтому использовать UpdateResource, но я не совсем уверен в этом. Мой исполняемый файл не снабжен цифровой подписью, таким образом, это не должна быть проблема, изменяющая его.

Каков был бы способ решить эту проблему?

12
задан ЯegDwight 29 March 2010 в 15:29
поделиться

3 ответа

Если вы хотите сделать это программно, я бы начал с изучения Portable Executable file format (Wikipedia entry). Раздел ресурсов (.rsrc, см. раздел 6.9) должен содержать значок. Используя эту информацию, вы можете написать инструмент для изменения значка.

Если вы просто хотите быстро изменить значок в существующем файле, вы можете взломать его в редакторе ресурсов Visual Studio. Я проверил это с файлом, удалив старый значок и добавив новый. Значок .exe изменился в Проводнике на новый, и новый значок появился в меню Пуск, когда я перетащил его туда.

-- Редактировать --

Да, я согласен, что использование UpdateResource - хороший подход. Вот пример использования функций C++ для этого, и сигнатура P/Invoke для UpdateResource и FindResource.

4
ответ дан 2 December 2019 в 23:42
поделиться
 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/

Это может помочь.

0
ответ дан 2 December 2019 в 23:42
поделиться

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

Мне кажется, что структура закрепленных значков (фактически являющаяся ярлыком) не позволяет динамически изменять значок. Если я ошибаюсь, я открыт для комментариев и идей по этому поводу.

0
ответ дан 2 December 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: