Bekanntgabe eines neuen Fonts unter Windows XP

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MeckAvus
User
Beiträge: 1
Registriert: Mittwoch 30. April 2008, 11:03

Mittwoch 30. April 2008, 11:21

Hallo zusammen,

ich habe folgendes Problem:
Auf einem Windows XP-System soll per Python-Skript ein neuer Font installiert und nutzbar gemacht werden, ohne den Rechner neu starten zu müssen.
1.) *.ttf wird nach C:\WINDOWS\FONTS kopiert
2.) Registry-Eintrag wird geschrieben
3.) Font muss bekannt gemacht werden.

Punkt 1.) und 2.) ist kein Problem. Ich weiß auch, dass man per GDI32.dll und API-Funktion AddFontResource die Schriftart bekannt machen kann.

Nur wie kann ich das per Python-Skript erledigen?

Vielen Dank schonmal im Voraus für jede Hilfe, die da kommen möge!

:wink:
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 30. April 2008, 13:46

Hallo MeckAvus, willkommen im Forum,

auf Funktionen in C-DLLs kannst du mittels ctypes zugreifen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Mittwoch 30. April 2008, 13:51

Und dann gibt es natürlich von pywin32... desweiteren wünsche ich dir dann viel Spaß mit der Win-API ;)
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Mittwoch 6. August 2008, 17:18

Ich habe ein kleines VBScript gefunden, das Fonts installieren kann.
Allerdings gibt es z.B. wenn ein Font bereits vorhanden ist, PopUps die vom user erwarten dass dieser auf "OK" drückt. Ich habe leider auch nach mehrstündigem googeln keine Ahnung wie sich diese Popups verhindern lassen. So nützt es mir nämlich nichts :(
Hat Ansonsten evtl. jemand eine Python-Lösung inzwischen, oder weiss zufällig wie sich diese Popups umgehen lassen?

hier mal das vbscript (die zu installierende font wird als Argument übergeben):

Code: Alles auswählen

Dim strFontsPath, oApp, oShell
  
Set oShell = CreateObject("WScript.Shell")
  
Set oApp = CreateObject("Shell.Application")

  
strFontsPath = oShell.ExpandEnvironmentStrings("%WINDIR%") & "\Fonts"

oApp.Namespace(strFontsPath).CopyHere WScript.Arguments(0)
  

Set oApp = Nothing
thx,
knekke
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Mittwoch 6. August 2008, 20:43

Macht Dein Code denn mehr als den Font in das Windows/Fonts-Verzeichnis zu kopieren?
MfG
HWK
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Mittwoch 6. August 2008, 22:02

Jein!
Die fonts werden nur kopiert, aber im Gegensatz zu einem einfachen kopieren per Python (was ich natürlich vorher probiert habe), übernimmt hier der WindowsExplorer den Kopiervorgang und die Schrift wird deshalb gleich auch installiert (incl. Fortschrittsbalken und leider auch der obengenannten Fehlermeldungen).
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Mittwoch 6. August 2008, 22:41

MeckAvus hat geschrieben:Nur wie kann ich das per Python-Skript erledigen?

Code: Alles auswählen

import ctypes
ctypes.windll.gdi32.AddFontResourceA(dein_font)
MfG
HWK
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Donnerstag 7. August 2008, 08:19

Hab' ich eigentlich schonmal erwähnt, dass das hier mein absolutes lieblingsforum ist? Und dabei bin ich echt nur GelegenheitspseudoCoder...
lunar

Donnerstag 7. August 2008, 08:47

HWK hat geschrieben:
MeckAvus hat geschrieben:Nur wie kann ich das per Python-Skript erledigen?

Code: Alles auswählen

import ctypes
ctypes.windll.gdi32.AddFontResourceA(dein_font)
MfG
HWK
Auf einem modernen Windows-System würde ich ja eher die W-Variante aufrufen, samt Übergabe eines Unicode-Objekts. Die Übergabe eines "wchar" dürfte von effizienter sein, da die Windows-API (iirc seit Windows 2000) intern eh Unicode nutzt, die "A"-Variante erfordert folglich nur eine zusätzliche Konvertierung.
Antworten