我假设这是Windows中某个共享资源。与其为每个应用程序制作副本,有没有一种方法可以像所有Winforms应用程序一样使用此图标?
默认情况下,Winforms应用程序如何指定它?我在代码或项目设置中看不到任何图标的参考。只是使用“默认图标”。
默认情况下,Winforms应用程序如何指定它?我在代码或项目设置中看不到任何图标的参考。只是使用“默认图标”。
这个图标资源存储在System.Windows.Forms.dll程序集中。您可以通过Reflector获取一份拷贝。打开程序集,打开"Resources"节点,一直向下滚动找到"wfc.ico"。右键单击,选择"另存为"。不确定为什么要使用它,因为它是默认设置。
您可以在项目+属性、应用程序选项卡、图标设置中为应用程序设置自定义图标。每个表单都有自己的图标属性。
这个资源被存储在System.Windows.Forms.dll程序集中。你可以通过反射来获取一个副本,方法如下:
public static class FormUtils
{
private static Icon _defaultFormIcon;
public static Icon DefaultFormIcon
{
get
{
if (_defaultFormIcon == null)
_defaultFormIcon = (Icon)typeof(Form).
GetProperty("DefaultIcon", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static).GetValue(null, null);
return _defaultFormIcon;
}
}
public static void SetDefaultIcon()
{
var icon = Icon.ExtractAssociatedIcon(EntryAssemblyInfo.ExecutablePath);
typeof(Form)
.GetField("defaultIcon", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)
.SetValue(null, icon);
}
}
public static class FormExtensions
{
internal static void GetIconIfDefault(this Form dest, Form source)
{
if (dest.Icon == FormUtils.DefaultFormIcon)
dest.Icon = source.Icon;
}
}
从代码中可以看出,你以这种方式拥有相同的 Icon.Handle。相同的引用。 Form.DefaultIcon 是 Form 类中一个内部延迟加载的静态属性。
你也可以覆盖默认的 Winforms 图标。在 Program.cs 中我使用了:
FormUtils.SetDefaultIcon();
这个函数将使用你应用程序属性中指定的图标,也就是你可执行文件的图标,覆盖默认图标。
%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary\1033
以前的VS版本可能会有类似的目录,如果需要的话可以看一下。
编辑:
在未压缩文件夹中搜索app
,可得到两个值得注意的结果:
Application.ico 和 ApplicationGeneric.ico + 其 *.png 版本。
如果你有 VS 2010 并且这里的任何图标都适合你,我相信你不需要复制任何一个 - 当使用“现有项目......”对话框添加时,你应该能够间接包含文件(作为共享/链接文件); 你可以通过选择Add
按钮旁边的箭头并选择Add As Link
选项来实现这一点。
我看不到直接覆盖这些文件以尝试应用全局更改的效果。
Save
方法:
C#:
string IcoFilename = "C:\\Junk\\Default.ico";
using (System.IO.FileStream fs = new System.IO.FileStream(IcoFilename, System.IO.FileMode.Create))
{
this.Icon.Save(fs);
}
Visual Basic:
Dim strFilename As String = "C:\Junk\Default.ico"
Using fs As New System.IO.FileStream(strFilename, IO.FileMode.Create)
Me.Icon.Save(fs)
End Using
private static Icon defaultIcon = new Form().Icon;
// ...
if(this.Icon == defaultIcon)
{
// ...
}