【问题标题】:Programmatically change the icon of the executable以编程方式更改可执行文件的图标
【发布时间】:2011-02-02 02:29:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c# windows windows-7 icons taskbar


【解决方案1】:

如果您想以编程方式执行此操作,我将从查看Portable Executable file format (Wikipedia entry) 开始。资源部分(.rsrc,参见第 6.9 节)应包含图标。使用这些信息,您可以编写一个工具来修改图标。

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

-- 编辑--

是的,我同意使用UpdateResource 是一个好方法。 Here is an example 我发现使用 C++ 函数来执行此操作,以及 UpdateResourceFindResource 的 P/Invoke 签名。

【讨论】:

  • 有趣的方法。虽然有一个问题——资源编辑器是一个很好的工具,我用了一段时间,但我需要直接在代码中更改图标。最终用户将无法使用资源编辑器每分钟更改图标。
【解决方案2】:
 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/

这可能会有所帮助。

【讨论】:

  • 看起来很眼熟。这不是这里的解决方案。
  • 正如 nobugz 提到的,这不是解决方案。我需要更改实际可执行文件中的图标,而不是快捷方式中的图标。
【解决方案3】:

我决定实施一种解决方法 - 窗口缩略图中的图标将发生变化(在 Windows 7 中可能)。如果图标未固定,用户可以看到图标发生变化。如果它被固定,缩略图将根据当前天气情况发生变化。

在我看来,固定图标的结构(实际上是一种快捷方式)不允许动态图标更改。如果我错了,我愿意接受 cmets 和这方面的想法。

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2017-12-14
    • 2023-03-16
    相关资源
    最近更新 更多