Announcement

Collapse
No announcement yet.

Fonts unter Windows 7 automatisch installieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fonts unter Windows 7 automatisch installieren

    Ich habe folgenden Code für das installieren von neuen Fonts unter Windows 7. Der neue Zeichensatz ist verfügbar, aber es scheint als ob der neue Zeichensatz nicht Anwendung findet. Man hat das Gefühl die Schrift hat sich geändert, aber man merkt keinen Unterschied. Hat hier jemand schon Erfahrung sammeln können?

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using System.Runtime.InteropServices;
    
    
     
    
    namespace WindowsFormsApplication19
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            [DllImport("gdi32.dll")]
            static extern int AddFontResource(string lpszFilename);
    
            private void button1_Click(object sender, EventArgs e)
            {
                InstallFonts();
            }
    
            private static void InstallFonts()
            {
                try
                {
                    var windowsDirectory = Environment.GetEnvironmentVariable("SystemRoot") + "\\Fonts\\";
                    var directoryInfo = new DirectoryInfo(@"C:\temp");
    
                    foreach (var file in directoryInfo.GetFiles())
                    {
                        InstallIfNotExists(file, windowsDirectory);
                    }
    
                    AddFontResource(windowsDirectory + "\\ziggy.ttf");
                    AddFontResource(windowsDirectory + "\\billy.ttf");
    
                }
                catch (Exception ex)
                {
                    // Do something
                }
    
    
            }
    
            private static void InstallIfNotExists(FileInfo file, string windowsDirectory)
            {
                var destination = new FileInfo(windowsDirectory + file.Name);
    
                if (!destination.Exists)
                {
                    file.CopyTo(destination.ToString());
                    MessageBox.Show("Kopieren erfolgreich");
                }
                else
                {
                    MessageBox.Show("Kopieren nicht erfolgreich");
                }
            }
        }
    }

  • #2
    Hast du dir auch die Bemerkungen zu dieser Funktion in der MSDN durchgelesen:

    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Comment


    • #3
      Danke Bernhard für den Hinweis.

      Ich denke ich bin komplett auf dem falschen Weg. Ziel ist es:
      Einen MSI Installer zu erstellen (hab ich hier zuerst nicht erwähnt), der eben eine Schriftart auf einem Server installiert (also ins Windows\Font Verzeichnis kopiert, in der Registry einträgt und eine Message (WM_FONTCHANGE) sendet um die sofortige Verfügbarkeit der neuen Schriftart zu verkünden. Also wenn jemand schon solch eine Lösung hat, würde ich mich über den Code freuen.

      Comment


      • #4
        Mir sticht das Wort Server ins Auge am Anfang hieß es noch Windows 7. Hat das hier irgendeien Relevanz das du das erwähnst?

        Comment


        • #5
          Entschuldigt das ungeschickte Formulieren, aber richtig ist es wie folgt: Ja auf einem Server soll es installiert werden, entwicklen kann ich es aber nur unter Windows 7. Sicherlich kann es von Betriebssystem (BS) zu BS unterschiede geben, aber die muss ich vorerst mal in Kauf nehmen.

          Comment


          • #6
            Originally posted by KASIC View Post
            Ich denke ich bin komplett auf dem falschen Weg. Ziel ist es:
            Einen MSI Installer zu erstellen (hab ich hier zuerst nicht erwähnt), der eben eine Schriftart auf einem Server installiert (also ins Windows\Font Verzeichnis kopiert, in der Registry einträgt und eine Message (WM_FONTCHANGE) sendet um die sofortige Verfügbarkeit der neuen Schriftart zu verkünden. Also wenn jemand schon solch eine Lösung hat, würde ich mich über den Code freuen.
            Ich denke jeder 0815 Windows-Installer wird das können. Wieso also selbst was programmieren

            Comment


            • #7
              Ich hab VS 2012 aber ich krieg das nicht auf die Reihe, hab auch nie so einen Installer gemacht. Hat jemand eine gute Seite (Deutsch oder Englisch mir egal) wo man sich so eine Font Folder Installer anschauen bzw. Nachlesen kann? Damit wäre mir wirklich geholfen... KASIC

              Comment


              • #8
                Ich habe in diesem Thread meine Frage etwas ungeschickt gestellt, drum möchte ich mit diesem Beitrag das ganze etwas gerade stellen. Der folgende Code kopiert eine eingebettete Schriftart in den Windows Fonts Folder

                Code:
                using System;
                using System.Collections.Generic;
                using System.Linq;
                using System.Text;
                using System.Threading.Tasks;
                using System.IO;
                using System.Runtime.InteropServices;
                using Microsoft.Win32;
                using System.Net;
                using System.Windows.Forms;
                
                namespace InstFontMSE
                {
                  class Program
                  {
                
                    [DllImport("gdi32.dll")]
                    static extern int AddFontResource(string lpszFilename);
                
                    [DllImport("user32.dll")]
                    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
                    IntPtr lParam);
                
                    static uint WM_FONTCHANGE = 0x1D;
                    static IntPtr HWND_BROADCAST = new IntPtr(0xffff);
                
                    static void Main(string[] args)
                    {
                
                      const string userRoot = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts";
                      const string keyName = userRoot;
                
                      try
                      {      
                        File.WriteAllBytes("C:\\Windows\\Fonts\\HelveNeuLTBol.ttf", Properties.Resources.HelveNeuLTBol);
                      }
                      catch (Exception ex)
                      {
                        //MessageBox.Show(ex.ToString());
                      }
                   
                      //3.add font to registry
                      try
                      {
                        Registry.SetValue(keyName, "Helvetica Neue", "HelveNeuLTBol.ttf");
                      }
                      catch (Exception ex)
                      {
                        //
                      }
                
                      SendMessage(HWND_BROADCAST, WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);
                
                      //restart nötig fragen
                      DialogResult dlgResult = MessageBox.Show(new Form() { TopMost = true }, "Restart required! Do you want to restart now?", "restart?",
                                 MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                      if (dlgResult == DialogResult.Yes)
                      {
                        //System.Diagnostics.Process.Start("ShutDown", "/r");
                        System.Diagnostics.Process.Start("shutdown", "-r -t 00");
                      }
                      else if (dlgResult == DialogResult.No)
                      {
                        Console.WriteLine("NO");
                      }
                
                    }
                
                    public static void InstallIfNotExists(FileInfo file, string windowsDirectory)
                    {
                      var destination = new FileInfo(windowsDirectory + file.Name);
                
                      if (!destination.Exists)
                      {
                        file.CopyTo(destination.ToString());
                      }
                      else
                      {
                       //just do nothing  
                      }
                    }
                
                  }
                }
                Sollte jemand einen Verbesserungsvorschlag haben, kann er dies gern verkünden. Danke und Sorry nochmal für die Verwirrung. Grüße KASIC

                Comment

                Working...
                X