从代码更改WPF程序集图标

luv*_*ere 2 wpf icons

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

编辑:

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

Ray*_*rns 5

概观

更改.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);
Run Code Online (Sandbox Code Playgroud)

您需要DllImport为函数添加声明并实现常量.请参阅MSDN上的文档,以了解如何BeginUpdateResource,UpdateResourceEndUpdateResource工作.

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

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

最后的说明

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