2010-03-29 4 views
11

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

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

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

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

Каким будет решение этой проблемы?

+1

http://stackoverflow.com/questions/969033/change-pinned-taskbar-icon-windows-7 – Vivek

+1

@Vivek Это не помогает проблеме и не является решением. –

+3

Вы не можете использовать UpdateResource, файл .exe заблокирован. Ссылка Вивека примерно такая же хорошая, как и будет. В коде API окна есть хорошая оболочка: http://code.msdn.microsoft.com/WindowsAPICodePack –

ответ

3

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

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

- Edit -

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

+0

Интересный подход. Хотя есть проблема - редактор ресурсов - хороший инструмент, и я использовал его некоторое время, но мне нужно изменить значок непосредственно в коде. Конечный пользователь не сможет использовать редактор ресурсов для изменения значка каждую минуту. –

0
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/

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

+1

Выглядит хорошо. Это не решение. –

+1

Как упоминалось выше, это не решение. Мне нужно изменить значок в фактическом исполняемом файле, а не в ярлыке. –

0

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

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

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