从代码更改WPF程序集图标

时间:2009-11-25 14:54:44

标签: wpf icons

有没有办法从代码中更改WPF程序集图标?我不是指窗口图标,而是指.exe文件中显示的图标。

编辑:

我正在尝试在应用程序图标的表示中实现交互性 - 不同的用户启动的操作与当前状态相结合应该会导致不同的应用程序图标。我依赖于应用程序的可视化表示,因为它没有可见窗口,并且交互基于热键和一般系统使用模式。

5 个答案:

答案 0 :(得分:5)

<强>概述

更改.exe文件中的图标虽然有点麻烦但很简单。您可能需要做三件事:

  1. 阻止您的运行进程锁定.exe文件,以防止其被修改
  2. 可能修改文件权限以使其可写
  3. 实际编辑.exe文件以替换图标
  4. <强>详情

    第3步 - 实际编辑.exe文件 - 是最有趣的,所以我将从那里开始。您将使用BeginUpdateResource()中的UpdateResource()EndUpdateResource()kernel32.dll来电。基本上你这样做:

    byte[] data = File.ReadAllBytes(newIconFilePath);
           // Or otherwise load icon data
    
    IntPtr hUpdate = BeginUpdateResource(exePath, false);
    UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1), LANG_SYSTEM_DEFAULT,
                   data, data.Length);
    EndUpdateResource(hUpdate, false);
    

    您需要为函数添加DllImport声明并实现常量。有关BeginUpdateResourceUpdateResourceEndUpdateResource如何运作的详细信息,请参阅the documentation on MSDN

    对于第1步 - 防止.exe被锁定 - 简单的解决方案是向应用程序启动添加代码,以检查当前.exe是否从临时目录(Path.GetTempPath())运行。如果没有,它会使用File.Copy()将.exe复制到临时目录以及所需的任何其他文件,然后使用一个额外的命令行参数执行它,该参数提供原始.exe的位置。然后退出原始进程,删除.exe文件上的锁。

    对于第2步 - 更正权限 - 这只需修改ACL并可能触发UAC对话框。有很多例子,你可能不需要这样做,所以我会跳过进一步的解释

    最后的注释

    以上步骤实际上允许您编辑真实.exe文件的实际图标。但是,如果您只需要更改可视图标,我建议您使用快捷方式并改为编辑其图标。

答案 1 :(得分:3)

在文件夹窗口中查看exe时看到的图标是在exe中设置的,可以从代码中更改该图标,但这比你想象的要麻烦。

您在开始菜单,桌面和快速启动工具栏上看到的图标都设置在快捷方式文件中(每个位置上的文件不同),编辑这些文件并不困难。

您可以使用Com和IShellLink完成此操作 http://msdn.microsoft.com/en-us/library/bb776891%28VS.85%29.aspx

这是一个简化事物的包装类: http://vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/Creating_and_Modifying_Shortcuts/article.asp

您也可以使用Windows脚本主机执行此操作: http://www.codeproject.com/KB/dotnet/shelllink.aspx

答案 2 :(得分:2)

如果你想让实际的桌面图标发生变化,

Nir's suggestion使用快捷方式确实是你最好的方法。

对于无窗口应用程序,更好的方法可能是在通知区域中安装一个图标。您可以在通知区域here中阅读有关在win32中添加/更改图标的详细信息。 .NET通过System.Windows.Forms.NotifyIcon支持此功能。这些API中的任何一个都可以让您根据需要更改/动画图标;给你一个批准的地方通知用户事件;并为您提供一个中心位置,让用户使用菜单与您的应用程序进行交互。这样做的好处是,即使窗口最大化,您的图标仍然可见(假设用户没有隐藏它,在这种情况下您可能希望让它们这样做)。

另请参阅Windows 7 guidelines有关通知区域的礼貌用法。使用操作系统比使用操作系统更容易。

答案 3 :(得分:0)

嗯,你不打算在运行时更改exe文件!

装配图标在项目文件中定义。您可以将其作为构建过程的一部分进行更改,但不能在应用程序运行时进行更改

你想要达到什么目标?

答案 4 :(得分:0)

来自msdn

  

当系统显示图标时,它必须从.exe或.dll文件中提取相应的图标图像。系统使用以下步骤选择图标图像:

  1)选择RT_GROUP_ICON资源。如果存在多个此类资源,Microsoft Windows NT / Windows 2000 / Windows XP将使用资源脚本中列出的第一个资源,而Windows 95 / Windows 98 / Windows Millennium Edition(Windows Me)会选择按字母顺序列出的第一个资源。

  2)从RT_GROUP_ICON资源中选择适当的RT_ICON映像。如果存在多个图像,系统将使用以下条件选择图像:
  选择最接近所请求大小的图像。
  如果存在该尺寸的两个或更多个图像,则选择与显示器的颜色深度匹配的图像。

  如果没有图像与显示器的颜色深度完全匹配,则选择具有不超过显示器颜色深度的最大颜色深度的图像。如果全部超过颜色深度,则选择颜色深度最浅的那个。

对我来说,接近这一点的自然方式是改变Windows资源管理器的行为方式。 我建议你看一下shell扩展。您可以编写一个shell扩展,根据某些状态更改图标或使用图标叠加来指示状态。最棘手的部分是让你的shell扩展知道应用程序状态。

可执行文件可以有多个图标资源,shell扩展可以从应用程序中提供的图标中获取特定图标。