我正在开发一个名为WeatherBar的应用程序。它的主要功能是基于它与Windows 7任务栏的交互 - 它根据特定位置的天气条件更改图标。
我在应用程序中使用的图标都存储在已编译的本机资源文件(.res)中 - 我正在使用它而不是仅用于图标的嵌入式资源清单。默认情况下,我修改主窗体的Icon属性以相应地更改图标,只要图标没有固定到任务栏,它就可以正常工作。当它被固定时,任务栏中的图标会自动切换到可执行文件的默认图标(资源文件中的索引为0)。
经过一些研究后,我发现更改图标的方法是更改快捷方式图标(因为所有固定应用程序实际上都是存储在用户文件夹中的快捷方式)。但它没有用。
我认为我需要更改可执行文件的图标,因此使用UpdateResource
,但我不完全确定。我的可执行文件没有经过数字签名,因此修改它不应该是一个问题。
解决这个问题的方法是什么?
答案 0 :(得分:4)
如果您想以编程方式执行此操作,请先查看Portable Executable file format(Wikipedia entry)。资源部分(.rsrc,请参见第6.9节)应包含图标。使用此信息,您可以编写一个工具来修改图标。
如果您只想快速更改现有文件中的图标,则可以在Visual Studio资源编辑器中进行修改。我通过删除旧图标并添加新图标来测试此文件。在Explorer中将.exe图标更改为新图标,当我将其拖动到“开始”菜单上时,新图标出现。
- 编辑 -
是的,我同意使用UpdateResource是一种很好的方法。 Here is an example我发现使用C ++函数执行此操作,以及UpdateResource和FindResource的P / Invoke签名。
答案 1 :(得分:0)
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);
}
这可能会有所帮助。
答案 2 :(得分:0)
我决定实施一种解决方法 - 图标将在窗口的缩略图中更改(在Windows 7中可以)。如果取消固定图标,则用户可以看到图标发生变化。如果它被固定,缩略图将根据当前的天气状况而改变。
在我看来,固定图标的结构(实际上是一个快捷方式)不允许动态图标更改。如果我错了,我愿意就此提出意见和建议。