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

C# 以编程方式更改可执行文件的图标,c#,windows,windows-7,icons,taskbar,C#,Windows,Windows 7,Icons,Taskbar,我正在开发一个名为的应用程序。它的主要功能是基于与Windows 7任务栏的交互-它会根据特定位置的天气条件更改图标 我在应用程序中使用的图标都存储在编译的本机资源文件中(.res)-我使用它而不是仅用于图标的嵌入式资源清单。默认情况下,我修改主窗体的图标属性以相应地更改图标,只要图标没有固定到任务栏上,它就可以正常工作。锁定后,任务栏中的图标会自动切换到可执行文件的默认图标(资源文件中的索引为0) 在做了一点研究之后,我认为更改图标的一种方法是更改快捷方式图标(因为所有固定的应用程序实际上都是

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

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

在做了一点研究之后,我认为更改图标的一种方法是更改快捷方式图标(因为所有固定的应用程序实际上都是存储在用户文件夹中的快捷方式)。但它不起作用

我假设我需要更改可执行文件的图标,因此使用
UpdateResource
,但我不能完全确定这一点。我的可执行文件没有数字签名,所以修改它不应该是个问题

解决这个问题的办法是什么

 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);
    }
这是从


这可能会有所帮助。

如果您希望以编程方式执行此操作,我将从()开始。参考资料部分(.rsrc,见第6.9节)应包含图标。使用此信息,您可以编写一个工具来修改图标

如果只想快速更改现有文件中的图标,可以在VisualStudio资源编辑器中对其进行破解。我通过删除旧图标并添加新图标,用一个文件对此进行了测试。exe图标在资源管理器中更改为新图标,当我将其拖动到“开始”菜单时,新图标出现在该菜单上

--编辑--


是的,我同意使用是一种很好的方法。我发现使用C++函数来实现这一点,并且对于/.p/> > p>我决定执行一个解决方案——图标将在窗口的缩略图中改变(在Windows 7中是可能的)。如果图标未固定,用户可以看到图标的变化。如果它被固定,缩略图将根据当前的天气条件进行更改


在我看来,固定图标的结构(实际上是一种快捷方式)不允许动态图标更改。如果我错了,我愿意就此发表评论和想法。

@Vivek这无助于解决问题,也不是一个解决方案。您不能使用UpdateResource,因为.exe文件已锁定。维韦克的链接将是最好的。Windows API代码包中有一个很好的包装器:我实际上是在使用Windows API代码包来管理跳转列表和任务栏中的进度,但我看不到(目前)替换可执行图标的方法。查看APICodePack中的重叠图像。看起来很熟悉。正如nobugz提到的,这不是解决方案。我需要更改实际可执行文件中的图标,而不是快捷方式中的图标。有趣的方法。虽然有一个问题-资源编辑器是一个很好的工具,我使用了一段时间,但我需要直接在代码中更改图标。最终用户将无法使用资源编辑器每分钟更改图标。