2015-07-28 11 views
5

Sto utilizzando la funzione AddFontResource per installare localmente un carattere per la sessione di accesso corrente.Come utilizzare i caratteri installati con AddFontResource() Programmaticamente?

private void installFont(string fontPath) 
{ 
    IntPtr HWND_BROADCAST = new IntPtr(0xFFFF); 
    const int WM_FONTCHANGE = 0x1D; 
    string fontLocation = Environment.ExpandEnvironmentVariables(fontPath); 

    int result = AddFontResourceA(fontLocation); 
    //This is currently printing Number of Fonts Installed = 1 
    Console.WriteLine("Number of Fonts Installed = " + result); 

    SendMessage(HWND_BROADCAST, WM_FONTCHANGE); 

    PrivateFontCollection fontCol = new PrivateFontCollection(); 
    fontCol.AddFontFile(fontLocation); 

    var actualFontName = fontCol.Families[0].Name; 

    Console.WriteLine("Font Installed? = " + IsFontInstalled(actualFontName)); 
} 

Il risultato int che la funzione AddFontResource sta tornando è 1, che secondo la documentazione è il numero di caratteri che sono stati installati con successo.

Se la funzione ha esito positivo, il valore di ritorno specifica il numero di caratteri aggiunti.

Se la funzione non riesce, il valore di ritorno è zero. Non sono disponibili informazioni sull'errore esteso .

Quindi sto testando il carattere al codice utilizzando il seguente codice.

private static bool IsFontInstalled(string fontName) 
{ 
    using (var testFont = new Font(fontName, 8)) 
    { 
    return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase); 
    } 
} 

Tuttavia la funzione isFontInstalled è sempre tornando falsa.

Questa funzione esegue un semplice test in cui tenta di creare un font utilizzando il nome di Fonts installato. Se l'installazione ha esito positivo, il nuovo carattere avrà il nome del carattere utilizzato, se non installato verrà impostato automaticamente su un diverso nome di carattere di sistema.

NOTA riconosco che il mio attuale implementazione di installazione dei font verifica a livello di codice non può funzionare per tutti i casi, si sentono liberi di suggerire modi superiori per verificare, presumo parte del problema potrebbe essere che il mio attuale implementazione funziona solo a verificare i font che sono stati installati usando il registro.

Io uso questa stessa funzione per verificare se un font che installo tramite il registro è installato e funziona come previsto. Qualche idea su come usare il font apparentemente installato?

Secondo la documentazione:

Questa funzione viene installato il tipo di carattere solo per la sessione corrente. Al riavvio del sistema , il carattere non sarà presente. Per avere il font installato anche dopo aver riavviato il sistema, il font deve essere elencato nel registro .

Per quanto ne so, la sessione corrente dura fino a quando l'utente non si disconnette e questo dovrebbe includere la funzione di test di questo programma.

+1

Supponendo che 'fontLocation' sia un percorso verso un TTF, il nome del font dovrebbe essere' YOURFONT.TTF' in quanto il costruttore 'Font' desidera che il nome della famiglia non sia il nome del file; Ad esempio, se hai aggiunto "ALGER.TTF", avresti passato "Algerino" " –

+1

Mi dispiace, ho ritagliato quel codice dall'esempio che ho postato, lo sto già facendo. Grande cattura comunque! +1 Codice modificato per contenere il parametro corretto per la famiglia di font – Unome

+0

Passare FontFamily al posto del nome. –

risposta

2

Secondo la documentazione sul enter link description here

Se la funzione riesce, il valore di ritorno è diverso da zero.

Se la funzione non riesce, il valore di ritorno è zero.

ho creato una rapida applicazione in cui ho aggiunto un font utilizzando AddFontResource su un font valido e poi chiamato RemoveFontResource su quello stesso tipo di carattere valido, un codice di uscita diverso da zero è stato restituito.Ho quindi fatto il contrario e aggiunto un font fasullo utilizzando il AddFontResource e RemoveFontResource ha restituito un codice di uscita 0. È possibile utilizzare questo per verificare se il font è stato effettivamente installato e se riesce a disinstallare, è sufficiente che il metodo di verifica reinstalli nuovamente il font.

Spero che questo aiuti.

+1

Fantastica idea, questo è esattamente ciò di cui avevo bisogno! + 1 – Unome

Problemi correlati