在Windows中哪里可以找到默认的Winforms图标?

5
我假设这是Windows中某个共享资源。与其为每个应用程序制作副本,有没有一种方法可以像所有Winforms应用程序一样使用此图标?
默认情况下,Winforms应用程序如何指定它?我在代码或项目设置中看不到任何图标的参考。只是使用“默认图标”。
5个回答

11

这个图标资源存储在System.Windows.Forms.dll程序集中。您可以通过Reflector获取一份拷贝。打开程序集,打开"Resources"节点,一直向下滚动找到"wfc.ico"。右键单击,选择"另存为"。不确定为什么要使用它,因为它是默认设置。

您可以在项目+属性、应用程序选项卡、图标设置中为应用程序设置自定义图标。每个表单都有自己的图标属性。


谢谢,我想将其用作我的 WPF 应用程序的默认图标。 - Joan Venge

4

这个资源被存储在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();

这个函数将使用你应用程序属性中指定的图标,也就是你可执行文件的图标,覆盖默认图标。


4
如果您安装了Visual Studio 2010,那么其中包含了大量的图标(可能包括应用程序图标),请查看以下目录:
%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary\1033

以前的VS版本可能会有类似的目录,如果需要的话可以看一下。

编辑:

在未压缩文件夹中搜索app,可得到两个值得注意的结果:

Application.icoApplicationGeneric.ico + 其 *.png 版本。

如果你有 VS 2010 并且这里的任何图标都适合你,我相信你不需要复制任何一个 - 当使用“现有项目......”对话框添加时,你应该能够间接包含文件(作为共享/链接文件); 你可以通过选择Add按钮旁边的箭头并选择Add As Link选项来实现这一点。

我看不到直接覆盖这些文件以尝试应用全局更改的效果。


2
您可以直接使用 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

0
我遇到了一個類似但不同的問題。與需要獲取默認圖標不同,我需要檢查表單上的圖標是否設置或是保留為默認值。雖然我本可以使用反射來解決它,但最終我選擇了一個更簡單的方法:
private static Icon defaultIcon = new Form().Icon;

// ...

if(this.Icon == defaultIcon)
{
    // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接