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

从代码更改WPF程序集图标

  •  2
  • luvieere  · 技术社区  · 15 年前

    是否有方法从代码中更改WPF程序集图标?我不是指窗口图标,而是指出现在.exe文件上的图标。

    编辑:

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

    5 回复  |  直到 15 年前
        1
  •  5
  •   Ray Burns    15 年前

    概述

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

    1. 阻止正在运行的进程对.exe文件持有锁,这将阻止对其进行修改
    2. 可能修改文件权限使其可写
    3. 实际编辑.exe文件以替换图标

    细节

    第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 函数和实现常量的声明。见 the documentation on MSDN 有关如何 BeginUpdateResource , UpdateResource EndUpdateResource 工作。

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

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

    最后说明

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

        2
  •  3
  •   Nir    15 年前

    在文件夹窗口中查看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

        3
  •  2
  •   Community CDub    7 年前

    Nir's suggestion 如果你想改变桌面图标,使用快捷方式是最好的方法。

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

    也见 Windows 7 guidelines 为了礼貌地使用通知区域。使用操作系统总是比反对它更容易。

        4
  •  0
  •   TFD    15 年前

    嗯,你不应该在运行时更改一个exe文件!

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

    你想达到什么目的?

        5
  •  0
  •   Onots    15 年前

    msdn :

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

    1)选择rt_group_图标资源。如果存在多个这样的资源,则Microsoft Windows NT/Windows 2000/Windows XP使用资源脚本中列出的第一个资源,而Windows 95/Windows 98/Windows Millennium Edition(Windows Me)则按字母顺序选择列出的第一个资源。

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

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

    对我来说,处理这个问题的自然方法就是改变Windows资源管理器的行为方式。 我建议您看看shell扩展。您可能能够编写一个shell扩展,它根据某种状态更改图标,或者使用图标覆盖来指示状态。其中最棘手的部分是让shell扩展了解应用程序状态。

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