Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Установить и удалить шрифт (http://forum.oszone.net/showthread.php?t=163294)

FlatX007 12-01-2010 20:21 1318523

Установить и удалить шрифт
 
Как мне устанновить шрифт ?

Я вобщем делал так.

Копирую шрифт в папку Font
Создаю пустой файл font.reg
Дальше делаю мульти реговый :) файл

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]

Дальше название шрифта

Дальше добавляю в реестр ... в реестре запись появляется ... а шрифта в списке нет :( как мне сделать то ?
Код немогу прилепить я не со своего компьютера.

Yashied 12-01-2010 21:47 1318614

Если ты копируешь шрифт непосредственно в папку ...\WINDOWS\Fons, то в реестр не нужно ничего добавлять, оно само добавится.

Creat0R 12-01-2010 23:49 1318738

Цитата:

Цитата Yashied
Если ты копируешь шрифт непосредственно в папку ...\WINDOWS\Fons, то в реестр не нужно ничего добавлять, оно само добавится. »

Но тем не менее шрифт не устанавливается как положенно, я использую такую функцию:

Код:

_FileFontInstall(@ScriptDir & "\Ethnocentric.ttf", "AutoIt Font")
ConsoleWrite(@error)

Func _FileFontInstall($sSourceFile, $sFontDescript="", $sFontsPath="")
    Local Const $HWND_BROADCAST = 0xFFFF
    Local Const $WM_FONTCHANGE = 0x1D

    If $sFontsPath = "" Then $sFontsPath = @WindowsDir & "\fonts"

    Local $sFontName = StringRegExpReplace($sSourceFile, "^.*\\", "")
    If Not FileCopy($sSourceFile, $sFontsPath & "\" & $sFontName, 1) Then Return SetError(1, 0, 0)

    Local $hSearch = FileFindFirstFile($sSourceFile)
    Local $iFontIsWildcard = StringRegExp($sFontName, "\*|\?")
    Local $aRet, $hGdi32_DllOpen = DllOpen("GDI32.dll")

    If $hSearch = -1 Then Return SetError(2, 0, 0)
    If $hGdi32_DllOpen = -1 Then Return SetError(3, 0, 0)

    While 1
        $sFontName = FileFindNextFile($hSearch)
        If @error Then ExitLoop

        If $iFontIsWildcard Then $sFontDescript = StringRegExpReplace($sFontName, "\.[^\.]*$", "")

        $aRet = DllCall($hGdi32_DllOpen, "Int", "AddFontResource", "str", $sFontsPath & "\" & $sFontName)
        If IsArray($aRet) And $aRet[0] > 0 Then
            RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", _
                $sFontDescript, "REG_SZ", $sFontsPath & "\" & $sFontName)
        EndIf
    WEnd

    DllClose($hGdi32_DllOpen)
    DllCall("User32.dll", "Int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_FONTCHANGE, "int", 0, "int", 0)
    Return 1
EndFunc

Ethnocentric.ttf

FlatX007 15-01-2010 17:50 1321112

Пасиба работает =)

Но "косячок" один ...если шрифт переименован и в папке Font есть с таким же названием ... то ничего непоставится. Я думаю сравнивать по метаданным (в свойствах файла) - но этоя уже сам.

FlatX007 17-01-2010 02:30 1322277

А как правильно удалить шрифт ?

Удаляю из папки и из реестра он всё равно числится в списке ... и даже открывается.

Creat0R 17-01-2010 14:29 1322583

Цитата:

Цитата FlatX007
как правильно удалить шрифт ? »

Примерно так:

Код:

Func _FileFontUnInstall($sFontFile)
    Local Const $HWND_BROADCAST = 0xFFFF
    Local Const $WM_FONTCHANGE = 0x1D

    Local $sFontsPath = @WindowsDir & "\fonts"
    Local $sFontName = StringRegExpReplace($sFontFile, "^.*\\", "")
    If @extended Then $sFontsPath = StringRegExpReplace($sFontFile, "\\[^\\]*$", "")

    Local $aRet = DllCall("Gdi32.dll", "Int", "RemoveFontResourceW", "wstr", $sFontsPath & "\" & $sFontName)

    If IsArray($aRet) And $aRet[0] > 0 Then
        Local $iEnum = 0, $sRegVal = "", $sRegRead
        Local $sRegFontsPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"

        While 1
            $iEnum += 1
            $sRegVal = RegEnumVal($sRegFontsPath, $iEnum)
            If @error <> 0 Then ExitLoop

            $sRegRead = RegRead($sRegFontsPath, $sRegVal)

            If $sRegRead = $sFontsPath & "\" & $sFontName Or $sRegRead = $sFontName Then
                RegDelete($sRegFontsPath, $sRegVal)
                DllCall("User32.dll", "Int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_FONTCHANGE, "int", 0, "int", 0)
                ExitLoop
            EndIf
        WEnd
    EndIf

    Return 1
EndFunc



Время: 07:27.

Время: 07:27.
© OSzone.net 2001-