以编程方式更改可执行文件的图标

12

我正在开发一个名为WeatherBar的应用程序。它的主要功能是基于其与Windows 7任务栏的交互 - 根据特定位置的天气条件更改图标。

我在应用程序中使用的所有图标都存储在编译的本地资源文件(.res)中 - 我仅使用它来嵌入图标,而不是使用嵌入式资源清单。默认情况下,我修改主窗体的Icon属性以相应地更改图标,这样做是有效的,只要图标没有固定到任务栏上。当它被固定时,任务栏中的图标会自动切换到可执行文件的默认图标(在资源文件中的索引为0)。

经过一些研究,我发现更改快捷方式图标(因为所有固定的应用程序实际上都是存储在用户文件夹中的快捷方式)可以更改图标。但它没有起作用。

我认为我需要更改可执行文件的图标,因此使用UpdateResource,但我不完全确定。我的可执行文件没有数字签名,因此修改它不应该是问题。

解决这个问题的方法是什么?


1
https://dev59.com/u3NA5IYBdhLWcg3wa9Kp - Vivek
1
@Vivek 这并没有解决问题,也不是一个解决方案。 - Den
3
您无法使用UpdateResource,因为.exe文件已被锁定。Vivek的链接是最好的选择。在Windows API Code Pack中有一个很好的包装器:http://code.msdn.microsoft.com/WindowsAPICodePack - Hans Passant
我实际上正在使用Windows API Code Pack来管理JumpLists和任务栏中的进度,但我目前看不到替换可执行文件图标的方法。 - Den
请查看APICodePack中的OverlayImage。 http://msdn.microsoft.com/en-us/magazine/dd942846.aspx#id0420051http://windowsteamblog.com/blogs/developers/archive/2009/07/28/windows-7-taskbar-dynamic-overlay-icons-and-progress-bars.aspx - JohnForDummies
OverlayIcon 是一个有点不同的东西。它的问题在于它会显示一个最小化的图标(16x16)在角落里,而在我的情况下,它应该显示为主要的应用程序图标。作为最后的手段 - 我将使用它。 - Den
3个回答

4
如果您想通过程序来实现这个功能,我建议您可以先查看一下可移植可执行文件格式Wikipedia entry)中的资源部分(.rsrc,见第6.9节),该部分应该包含了图标信息。有了这些信息,您就可以编写一个工具来修改图标了。
如果您只是想快速地更改某个现有文件中的图标,您可能可以使用Visual Studio资源编辑器来实现。我尝试过在一个文件中删除原有的图标并添加一个新图标。在资源管理器中,该文件的.exe图标已经变成了新图标,在开始菜单上拖动它时也会出现新的图标。
-- 编辑 --
是的,我同意使用UpdateResource是一个不错的方法。我找到了一个使用C ++函数来实现该功能的示例,以及UpdateResourceFindResource的P/Invoke签名。

有趣的方法。虽然存在一个问题——资源编辑器是一个好工具,我用了一段时间,但我需要直接在代码中更改图标。最终用户无法使用资源编辑器每分钟更改图标。 - Den

1
 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
看起来很熟悉,但这不是解决方案。 - Hans Passant
1
正如nobugz所提到的,这不是解决方案。我需要更改实际可执行文件中的图标,而不是在快捷方式中更改。 - Den

1

我决定实现一种解决办法 - 在缩略图中更改窗口的图标(在 Windows 7 中可以实现)。如果图标未固定,用户可以看到图标更改。如果已固定,则缩略图将根据当前天气条件更改。

对我来说,固定图标的结构(实际上是快捷方式)不允许动态更改图标。如果我错了,请随时提出评论和想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接