代码之家  ›  专栏  ›  技术社区  ›  Den

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

  •  12
  • Den  · 技术社区  · 15 年前

    我正在开发一个名为 WeatherBar . 它的主要功能是基于它与Windows7任务栏的交互作用,它根据特定位置的天气状况改变图标。

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

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

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

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Paul Williams    15 年前

    如果你想用编程的方法来完成这个任务,我首先要看看 Portable Executable file format ( Wikipedia entry )资源部分(.rsrc,见第6.9节)应包含图标。使用这些信息,您可以编写一个工具来修改图标。

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

    --编辑——

    是的,我同意使用 UpdateResource 是个好方法。 Here is an example 我发现使用C++函数这样做,并且调用p/Unjk签名 UpdateResource FindResource .

        2
  •  0
  •   Art W    15 年前
     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/

    也许有帮助。

        3
  •  0
  •   Den    15 年前

    我决定实施一个解决方案-图标将在窗口的缩略图中更改(在Windows7中是可能的)。如果取消固定图标,用户可以看到图标更改。如果它被固定,缩略图将根据当前的天气条件进行更改。

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

    推荐文章