我正在使用Visual C#2008 Express.我想为应用程序使用相同的图标(即.exe显示的图标),以及主窗体.不幸的是,VC#似乎并不是很聪明,并且坚持要复制图标数据.
似乎没有办法选择"已嵌入"的图标用于表单或项目图标(仅选择文件),并且对两个图标使用相同的文件只是将文件嵌入两次尽可能远看到.这不是什么大不了的事(现在硬盘空间很便宜,对吧?),但这让我很烦恼.
知道怎么避免这个吗?有没有办法以编程方式加载可执行文件的图标,以便在构建表单时使用,比如说?一些关于类似事情的论坛帖子似乎暗示.NET资源不使用普通的旧Windows资源系统 - 在获取旧式资源的框架内有没有办法?或者我是否必须绑定Win32 API函数才能执行此操作?
你是对的,而且很烦人.
您必须自己加载图标,而不是依赖设计器生成的代码.将图标保存为项目资源,然后将资源加载到Icon
窗体构造函数中的窗体属性中:
this.Icon = Properties.Resources.myIconResourceName;
你在找Icon.ExtractAssociatedIcon
.调用传递可执行文件:
var icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
是的,这很烦人.但是Icon.ExtractAssociatedIcon的建议答案的问题是它将检索32x32图标,然后在表单窗口或任务栏上下采样到16x16图标,除非你的32x32图标构造得非常巧妙,否则看起来很糟糕.
我正在做的方式是使用interop(将第一行放在表单构造函数中):
this.Icon = ExtractSmallIconFromLibrary(Application.ExecutablePath); ... public static Icon ExtractSmallIconFromLibrary(string file) { IntPtr[] reficon = new IntPtr[1]; int nextracted = ExtractIconEx(file, 0, null, reficon, 1); if (nextracted < 1) return null; Icon unmanaged_icon = Icon.FromHandle(reficon[0]); Icon icon = (Icon)unmanaged_icon.Clone(); DestroyIcon(unmanaged_icon.Handle); return icon; } [DllImport("Shell32", CharSet = CharSet.Auto)] extern static int ExtractIconEx( [MarshalAs(UnmanagedType.LPTStr)] string lpszFile, int nIconIndex, IntPtr[] phIconLarge, IntPtr[] phIconSmall, int nIcons ); [DllImport("user32.dll", CharSet = CharSet.Auto)] extern static bool DestroyIcon(IntPtr handle);
但这也不是很好,因为你确实需要像Alt-Tab图标列表那样的32x32图标.所以你真的需要提取整个图标,这是一个更大的工作.也许有一种直接的方法将两个图标合二为一.或者你可以像这个codeproject程序一样,它首先用大量的代码提取整个图标.