Я разрабатываю приложение под названием WeatherBar. Его основная функциональность основана на его взаимодействии с панелью задач Windows 7 — она изменяет значок в зависимости от погодных условий в определенном месте.
Значки, которые я использую в приложении, все хранятся в скомпилированном собственном файле ресурсов (.res) — я использую его вместо встроенной декларации ресурса для значков только. По умолчанию я изменяю свойство Icon основной формы для изменения значков соответственно, и это хорошо работает, пока значок не прикрепляется к панели задач. Когда это прикрепляется, значок в панели задач автоматически переключается на по умолчанию для исполняемого файла (с индексом 0 в файле ресурсов).
После выполнения определенного исследования я полагал, что способ изменить значок будет изменять ярлык (поскольку все прикрепленные приложения являются на самом деле ярлыками, сохраненными в пользовательской папке). Но это не работало.
Я предполагаю, что должен изменить значок для исполняемого файла, и поэтому использовать UpdateResource
, но я не совсем уверен в этом. Мой исполняемый файл не снабжен цифровой подписью, таким образом, это не должна быть проблема, изменяющая его.
Каков был бы способ решить эту проблему?
Если вы хотите сделать это программно, я бы начал с изучения Portable Executable file format (Wikipedia entry). Раздел ресурсов (.rsrc, см. раздел 6.9) должен содержать значок. Используя эту информацию, вы можете написать инструмент для изменения значка.
Если вы просто хотите быстро изменить значок в существующем файле, вы можете взломать его в редакторе ресурсов Visual Studio. Я проверил это с файлом, удалив старый значок и добавив новый. Значок .exe изменился в Проводнике на новый, и новый значок появился в меню Пуск, когда я перетащил его туда.
-- Редактировать --
Да, я согласен, что использование UpdateResource - хороший подход. Вот пример использования функций C++ для этого, и сигнатура P/Invoke для UpdateResource и FindResource.
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/
Это может помочь.
Я решил реализовать обходной путь - значок изменится на эскизе окна (это возможно в Windows 7). Если значок откреплен, пользователь может увидеть изменение значка. В случае закрепления миниатюра изменится в соответствии с текущими погодными условиями.
Мне кажется, что структура закрепленных значков (фактически являющаяся ярлыком) не позволяет динамически изменять значок. Если я ошибаюсь, я открыт для комментариев и идей по этому поводу.