C# .NET Winform 生成的应用程序如何添加多图标

  • A+
所属分类:体育平台


Winform 开发的时候默认只需要在属性上添加一个图标,然后就会按照这个图标默认生成一个图标,应用程序默认看到的图标也就是这个,但是在项目中,希望一个应用程序包含多个图标,这个C++ 好解决,只需要 res文件中多图标即可。可在Winform中就是一个很困扰的问题,找了很多办法始终没解决,后来想了一个办法,利用 C++ 生成一个res文件然后winform引用,没想到成功了。注册表调用也可用。

C# .NET Winform 生成的应用程序如何添加多图标


C# .NET Winform 生成的应用程序如何添加多图标


展示具体操作补助

  1. 若没有用C++开发的同学,先 VS 添加C++ 。


C# .NET Winform 生成的应用程序如何添加多图标

2.添加C++ 桌面应用程序 项目。

C# .NET Winform 生成的应用程序如何添加多图标

3.删除默认的 2个图标 ,然后按照顺序添加。注意 第一个一定是要添加程序默认显示图标。 程序显示的图标 是第一个,所以一定要注意顺序

C# .NET Winform 生成的应用程序如何添加多图标

4.由于删除了两个图标,生成会报错,直接将报错位置注释掉。由于目的是为了 获取图标 数据,所以 C++ 开发的软件是否能启动也就不重要了

C# .NET Winform 生成的应用程序如何添加多图标

5.生成程序 ,会在Debug中生成一个res 文件,复制文件到winform项目中

C# .NET Winform 生成的应用程序如何添加多图标


C# .NET Winform 生成的应用程序如何添加多图标

6.属性中找到资源


C# .NET Winform 生成的应用程序如何添加多图标

直接选择刚刚 复制的资源文件 res文件

完成,生成程序一个包含多个图标的winform就此完成。

个人找了很多办法都没有实现,唯独这个办法顺利的生成成功,各位还有其他的好办法记得留言一起分享。

下面贴一个 自定义后缀文件启动 注册表代码。可能会帮到大部分同学。

  private void RegKey()
        {
            string name = Application.ProductName;
          //此处是生成启动项,提供用户快速选择
            if (Registry.ClassesRoot.OpenSubKey(name, true) == null)
            {
                RegistryKey key;
                key = Registry.ClassesRoot.CreateSubKey(name);
                key.SetValue("", name);
                key = key.CreateSubKey("shell").CreateSubKey("open").CreateSubKey("command");
                key.SetValue("", #34;{Application.ExecutablePath} \"%1\"");

                Registry.ClassesRoot.CreateSubKey(name + "\\DefaultIcon").SetValue("", #34;{Application.ExecutablePath},2");
            }

            if (!Directory.Exists(AppRoaming))
                Directory.CreateDirectory(AppRoaming);
          
//此处方法是之前没找到 exe多图标采用的方法。生成一个ico文件。感觉不是很合适
            //if (Registry.ClassesRoot.CreateSubKey(name + "\\DefaultIcon").GetValue("")?.ToString() != #34;{AppRoaming}\\{Application.ProductName}_file_log_json.ico")
            //{
            //    Stream iconFileStream = new FileStream(#34;{AppRoaming}\\{Application.ProductName}_file_log_json.ico", FileMode.Create);
            //    Properties.Resources.json3_128x128.Save(iconFileStream);
            //    Registry.ClassesRoot.CreateSubKey(name + "\\DefaultIcon").SetValue("", #34;{AppRoaming}\\{Application.ProductName}_file_log_json.ico");
            //}

            if (Registry.ClassesRoot.OpenSubKey(name + "\\shell\\open\\command").GetValue("")?.ToString() != #34;{Application.ExecutablePath} \"%1\"")
            {
                Registry.ClassesRoot.CreateSubKey(name + "\\shell\\open\\command").SetValue("", #34;{Application.ExecutablePath} \"%1\"");
            }

            if (Registry.ClassesRoot.OpenSubKey(".json", true)?.GetValue("")?.ToString() != name)
            {
                if (bool.Parse(Registry.ClassesRoot.OpenSubKey(name)?.OpenSubKey("config")?.GetValue("MessageBox")?.ToString() ?? "true"))
                {
                    RegistryKey key;
                    if (MessageBox.Show("是否添加默认启动", "提醒", MessageBoxButtons.OKCancel) == DialogResult.OK)
                    {
                      //此处代码就是添加  自定义后缀启动文件
                        key = Registry.ClassesRoot.CreateSubKey(".json");
                        key.SetValue("", name);

                        key = Registry.ClassesRoot.CreateSubKey(name).CreateSubKey("config");
                        key.SetValue("MessageBox", false);
                    }
                    else
                    {
                        if (MessageBox.Show("下次启动是否继续提醒", "提醒", MessageBoxButtons.OKCancel) == DialogResult.OK)
                        {
                            key = Registry.ClassesRoot.CreateSubKey(name).CreateSubKey("config");
                            key.SetValue("MessageBox", true);
                        }
                        else
                        {
                            key = Registry.ClassesRoot.CreateSubKey(name).CreateSubKey("config");
                            key.SetValue("MessageBox", false);
                        }
                    }
                }
            }
        }
RegistryKey key;
key = Registry.ClassesRoot.CreateSubKey(name);
key.SetValue("", name);
key = key.CreateSubKey("shell").CreateSubKey("open").CreateSubKey("command");
key.SetValue("", #34;{Application.ExecutablePath} \"%1\"");

Registry.ClassesRoot.CreateSubKey(name + "\\DefaultIcon").SetValue("", #34;{Application.ExecutablePath},2");

key = Registry.ClassesRoot.CreateSubKey(".json");
key.SetValue("", name);
string name = Application.ProductName;

上述为关键代码 注意 1% 位置添加引号,否则 碰到很有 空格 “ ” 文件夹路径解析就是错误。这个很多网上贴的代码都没 讲解,很多同学碰到文件就无从下手了。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: