Installing Fonts programatically C#

来源:http://www.cnblogs.com/geovindu/archive/2017/09/01/7463728.html
-Advertisement-
Play Games

https://stackoverflow.com/questions/14796162/how-to-install-a-windows-font-using-c-sharp ...


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Drawing.Text;

namespace itextcsharpDemo
{

    /// <summary>
    /// 
    /// </summary>
    public partial class Form4 : Form
    {

        int result = -1;
        int error = 0;

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int WriteProfileString(string lpszSection, string lpszKeyName, string lpszString);
        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, // handle to destination window 
        uint Msg, // message 
        int wParam, // first message parameter 
        int lParam // second message parameter 
        );
        [DllImport("gdi32")]
        public static extern int AddFontResource(string lpFileName);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="FontFileName"></param>
        /// <param name="FontName"></param>
        private void installFont(string FontFileName,string FontName)
        {

            string WinFontDir = "C:\\windows\\fonts";
            //string FontFileName = "DS-Digital Bold Italic.TTF";
            //string FontName = "DS-Digital Bold Italic";
            int Ret;
            int Res;
            string FontPath;
            const int WM_FONTCHANGE = 0x001D;
            const int HWND_BROADCAST = 0xffff;
            FontPath = WinFontDir + "\\" + FontName;
            if (!File.Exists(FontPath))
            {
                File.Copy(FontFileName, FontPath); //System.Windows.Forms.Application.StartupPath + "\\DS-Digital Bold Italic.TTF"
                Ret = AddFontResource(FontPath);

                Res = SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
                Ret = WriteProfileString("fonts", FontName + "(TrueType)", FontFileName);
            }
        }

        [DllImport("gdi32", EntryPoint = "AddFontResource")]
        public static extern int AddFontResourceA(string lpFileName);
        //[System.Runtime.InteropServices.DllImport("gdi32.dll")]
        //private static extern int AddFontResource(string lpszFilename);
        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        private static extern int CreateScalableFontResource(uint fdwHidden, string
        lpszFontRes, string lpszFontFile, string lpszCurrentPath);

        //
        [DllImport("gdi32.dll", EntryPoint = "RemoveFontResourceW", SetLastError = true)]
        public static extern int RemoveFontResource([In][MarshalAs(UnmanagedType.LPWStr)]
                                            string lpFileName);

        /// <summary>
        /// Installs font on the user's system and adds it to the registry so it's available on the next session
        /// Your font must be included in your project with its build path set to 'Content' and its Copy property
        /// set to 'Copy Always'
        /// win 10 沒有許可權 塗聚文註
        /// </summary>
        /// <param name="contentFontName">Your font to be passed as a resource (i.e. "myfont.tff")</param>
        private static void RegisterFont(string contentFontName)
        {
            try
            {
                // Creates the full path where your font will be installed
                var fontDestination = Path.Combine(System.Environment.GetFolderPath
                                                  (System.Environment.SpecialFolder.Fonts), contentFontName);

                if (!File.Exists(fontDestination))
                {
                    // Copies font to destination
                    System.IO.File.Copy(Path.Combine(System.IO.Directory.GetCurrentDirectory(), contentFontName), fontDestination);

                    // Retrieves font name
                    // Makes sure you reference System.Drawing
                    PrivateFontCollection fontCol = new PrivateFontCollection();
                    fontCol.AddFontFile(fontDestination);
                    var actualFontName = fontCol.Families[0].Name;

                    //Add font
                    AddFontResource(fontDestination);
                    //Add registry entry  
                    Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts",
                    actualFontName, contentFontName, RegistryValueKind.String);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="NombreFnt"></param>
        /// <param name="RutaFnt"></param>
        internal static void InstalarFuente(string NombreFnt, string RutaFnt)
        {
            string CMD = string.Format("copy /Y \"{0}\" \"%WINDIR%\\Fonts\" ", RutaFnt);
            EjecutarCMD(CMD);

            System.IO.FileInfo FInfo = new System.IO.FileInfo(RutaFnt);
            CMD = string.Format("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\" /v \"{0}\" /t REG_SZ /d {1} /f", NombreFnt, FInfo.Name);
            EjecutarCMD(CMD);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Comando"></param>
        public static void EjecutarCMD(string Comando)
        {
            System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo("cmd.exe");
            Info.Arguments = string.Format("/c {0}", Comando);
            Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            System.Diagnostics.Process.Start(Info);
        }
        /// <summary>
        /// 
        /// </summary>
        public Form4()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form4_Load(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {

                //漢儀篆書繁.ttf
                //新蒂綠豆體.ttf
                string fontname = System.Windows.Forms.Application.StartupPath + @"\font\漢儀篆書繁.ttf"; // "漢儀篆書繁.ttf";//

                //win 10 安裝成功 Senty Pea 新蒂綠豆體
                //windows/syste32/shell32.dll
                //Shell32.Shell shell = new Shell32.Shell();
                //Shell32.Folder fontFolder = shell.NameSpace(0x14);
                //fontFolder.CopyHere(fontname);


                //沒有許可權
                //RegisterFont(fontname);

                installFont(fontname, "漢儀篆書繁.ttf");

                //無效
                //result = AddFontResource(fontname);
                //error = Marshal.GetLastWin32Error();
                //if (error != 0)
                //{
                //    MessageBox.Show(new Win32Exception(error).Message);
                //}

            }
            catch (Exception ex)
            {
               MessageBox.Show(ex.Message.ToString());
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            FontFamily[] fontList = new System.Drawing.Text.InstalledFontCollection().Families;
            InstalledFontCollection installedFonts = new InstalledFontCollection();
            List<FontList> list = new List<FontList>();
            int id = 0;
            foreach (FontFamily font in installedFonts.Families)
            {
                FontList l = new FontList();
                l.FontName = font.Name;
                l.FontId = id;
                list.Add(l);
                id++;
            }

            listBox1.DataSource = list;
            listBox1.ValueMember = "FontId";
            listBox1.DisplayMember = "FontName";
            



        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listBox1.Items.Count > 0)
            {
                object o = this.listBox1.SelectedItem;
                FontList od = new FontList();
                od = o as FontList;
                //MessageBox.Show(od.FontName);
                this.textBox1.Text = od.FontName;
            }
        }
    }
    /// <summary>
    /// 
    /// </summary>
    public class FontList
    {
        public int FontId { get; set; }
        public string FontName { get; set; }
    }
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

namespace itextcsharpDemo
{
    static class Program
    {
        /// <summary>
        /// 應用程式的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {

            //使用許可權
            var wi = WindowsIdentity.GetCurrent();
            var wp = new WindowsPrincipal(wi);

            bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator); //管理員許可權

            if (!runAsAdmin)
            {
                // It is not possible to launch a ClickOnce app as administrator directly,
                // so instead we launch the app as administrator in a new process.
                var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);

                // The following properties run the new process as administrator
                processInfo.UseShellExecute = true;
                processInfo.Verb = "runas";

                // Start the new process
                try
                {
                    Process.Start(processInfo);
                }
                catch (Exception)
                {
                    // The user did not allow the application to run as administrator
                    MessageBox.Show("Sorry, but I don't seem to be able to start " +
                       "this program with administrator rights!");
                }

                // Shut down the current process
                Application.Exit();
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new ManageForm());
            }
        }
    }
}

  https://stackoverflow.com/questions/14796162/how-to-install-a-windows-font-using-c-sharp


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.查看是否已經安裝Python CentOS 7.2 預設安裝了python2.7.5 因為一些命令要用它比如yum 它使用的是python2.7.5。 使用 python -V 命令查看一下是否安裝Python 然後使用命令 which python 查看一下Python可執行文件的位置 可見執 ...
  • 1.iftop iftop可測量通過每一個套接字連接傳輸的數據;它採用的工作方式有別於nload。iftop使用pcap庫來捕獲進出網路適配器的數據包,然後彙總數據包大小和數量,搞清楚總的帶寬使用情況。 雖然iftop報告每個連接所使用的帶寬,但它無法報告參與某個套按字連接的進程名稱/編號(ID)。 ...
  • package-cleanup 是一個python開發的命令程式,用來清除本機已安裝的、重覆的 或孤立的軟體包。 desktop版的CentOS鏡像包含這個工具,而Minimal版的CentOS鏡像不包含這個工具 使用場景:在 Redhat/CentOS 操作系統上,安裝了 重覆、錯誤、或孤立的rp ...
  • 以前寫的,怕引來口水戰,乾脆不發。這段時間面試了十來人,用Mac的開發水平明顯高於Windows的,挺多感想的,於是改改發了吧。 Windows: 對普通用戶而言體驗最友好,對開發者體驗最差; Linux:開發者的天堂,普通用戶的噩夢;從嵌入式開發到應用開發,一應俱全; Mac:WEB開發與設計師首 ...
  • 在 xamarin.android 綁定項目中,綁定 百度地圖的LBS地圖SDK,參考 https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-a-jar/ 設置好後,編譯 ...
  • 作者: "zyl910" 一、緣由 項目規模大了後,經常會出現源碼文件分佈在不同目錄的情況,但.NET Core項目預設只有項目目錄下的源碼文件,且不支持“Add As Link”方式引入文件。這時需要手工修改project.json文件了。 可能是因為最新版本已將 project.json 轉為 ...
  • FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read); //1. Reading from a binary Excel file ('97-2003 format; *.xls) IExcelDataRead ...
  • 有時我們會對一個list<T>集合里的數據進行去重,C#提供了一個Distinct()方法直接可以點得出來。如果list<T>中的T是個自定義對象時直接對集合Distinct是達不到去重的效果。我們需要新定義一個去重的類並繼承IEqualityComparer介面重寫Equals和GetHashCo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...