十字星

  • 首页
  • 技术
  • 随笔
  • 瞎折腾
  • 平面设计
  • 文集
  • 留言
  • 其他
    • API测试
  1. 首页
  2. 技术
  3. 正文

C#程序启动前检测并确保使用的字体已安装

2021-01-18 1404点热度 0人点赞 0条评论

项目中使用了微软雅黑字体,支持的操作系统从xp到w10,有的操作系统自带有这个字体有的操作系统则不带需要自行安装,安装字体的代码示例网上很容易就能找到,文章最后也会贴出,实际编写时想实现如果操作系统已经有该字体就不在安装,因此先做了系统字体枚举判断,不存在时安装字体.实践中发现没有微软雅黑字体的电脑每次都会报错找不到字体,经过半天的专研发现操作系统字体删掉之后,系统枚举中仍然有该字体,导致程序不会自动安装,找到原因后去掉系统枚举判断,改为判断系统字体文件夹中是否存在字体文件,问题解决

安装字体示例类

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace GlobalResource
{
    public class FontHelper
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int WriteProfileString(string lpszSection, string lpszKeyName, string lpszString);
        [DllImport("gdi32")]
        private static extern int AddFontResource(string lpFileName);

        /// <summary>安装字体</summary>
        /// <param name="fontPath">要安装的字体物理路径[包括文件名和扩展名]</param>
        public static void InstallFont(string fontPath)
        {
            string fontFileName = Path.GetFileName(fontPath);
            string fontNameWithoutExtenstion = Path.GetFileNameWithoutExtension(fontPath);
            string FontPath = Environment.GetEnvironmentVariable("WINDIR") + "\\fonts\\" + fontFileName;
            if (!File.Exists(FontPath))//[[判断系统文件夹中是否存在字体文件,不存在时执行字体安装]]
            {
                File.Copy(fontPath, FontPath);
                AddFontResource(FontPath);
                WriteProfileString("fonts", fontNameWithoutExtenstion + "(TrueType)", fontFileName);
            }
        }
        /// <summary>
        /// 获取所有安装的字体名称[[操作系统已经删除的字体,仍然在此系统枚举中]]
        /// </summary>
        /// <returns></returns>
        public static List<string> GetFontNames
        {
            get
            {
                List<string> listFamily = new List<string>();
                System.Drawing.Text.InstalledFontCollection fonts = new System.Drawing.Text.InstalledFontCollection();
                foreach (System.Drawing.FontFamily family in fonts.Families)
                {
                    listFamily.Add(family.Name);
                }
                return listFamily;
            }
        }
    }
}

 

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: C# WinForm
最后更新:2021-01-18

cxw

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >
最新 热点 随机
最新 热点 随机
git迁移项目中的某个目录到新项目 winform判断设计模式还是运行时模式 C# 中的where T : class, new() 到底是什么意思? 解决安装.NET失败并提示“无法建立到信任根颁发机构的证书链” 关闭.net4.0的http访问默认代理 删除名称最后带空格的文件夹
MySQL修改自增列起始值 C# 两个datatable中的数据快速比较返回交集 C#窗口Form大小设置过小时,始终显示为136*39解决办法 C# 泛型 Join合并数组为字符串 关于asp.net导出Excel出现“异常来自 HRESULT:0x800A03EC”错误的另一种可能 SQL2008对加密的存储过程解密
标签聚合
工具 WinForm Excel PHP W10 IT CentOS C# Linux WordPress
最近评论
admin 发布于 5 年前(01月22日) 使用Andi Dittrich作者的插件Enlighter实现
alex 发布于 5 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

Theme Kratos Made By Seaton Jiang