2011-01-18 6 views
5

È necessario installare un carattere su tutti i computer dell'utente che utilizzerà l'applicazione che sto scrivendo e che crea documenti personalizzati in Word. È un tipo di codice a barre.Come installo un font sul computer di un utente in VB.NET in modo che applicazioni come Word possano usarlo?

Ho aggiunto con successo il carattere alla mia soluzione e impostato la sua azione di compilazione su Risorsa incorporata e ho anche scritto correttamente il codice per verificare se il carattere è già installato sul sistema dell'utente.

Ora ho solo bisogno di capire come estrarre il tipo di carattere da mia soluzione e installarlo sul computer dell'utente come se fossero installati il ​​tipo di carattere se stessi per l'utilizzo in applicazioni di Office, ecc

La maggior parte degli esempi che ho Ho scoperto che ci sono per usare il font all'interno dell'applicazione VB.NET invece che all'esterno e quello che ho trovato che sembra adattarsi al mio scopo non funziona per me.

+6

Solo per commentare è necessario assicurarsi di essere autorizzati a distribuire il carattere - i caratteri sono software proprio come il tuo programma e hai bisogno del permesso prima di distribuire uno come descritto. – Oded

+4

Questo è il tipo di cosa tipicamente (e migliore) eseguita da un * programma di installazione *, piuttosto che dal programma stesso. Di solito è più facile dire al tuo programma di installazione di installare un font piuttosto che farlo dall'interno dell'applicazione. –

+0

Sarebbe grandioso, ma presumo che non sia qualcosa che va fatto con l'installer ClickOnce fornito con Visual Studio 2010 giusto? – Tom

risposta

2

Copiare il font nella cartella dei font di Windows e quindi è necessario per ottenere il tipo di carattere aggiunto al Registro di sistema.Non l'ho provato da solo, ma penso che sia possibile farlo aprendo il font usando l'API ShellExecuteA in un modo simile a quello visto come here.

Ecco un modo VBScript di farlo che potrebbero essere utili come punto di partenza dal momento che potrebbe essere in grado di utilizzare la sintassi e le funzioni simili in VB.Net: Hey, Scripting Guy! How Can I Install Fonts Using a Script?

+0

Perché dovresti usare la versione non Unicode di 'ShellExecute'? E in che modo esattamente aggiunge il carattere al registro? Non vedo quello dato come esempio nel link che hai fornito. –

+0

Questa è in realtà la soluzione più semplice. Il comportamento di questo metodo è come se si facesse doppio clic sul carattere in Windows, il che, se non ti dispiace, una barra di avanzamento di installazione di Windows non è affatto male. Verifica se il font esiste, in caso contrario, copia la risorsa ovunque, esegui shellexecute e quindi elimina il file del font estratto. – Tom

+0

Tuttavia, dovresti utilizzare la versione Unicode di "ShellExecute". E non credo che questo informi le applicazioni in esecuzione che la tabella dei font di sistema è stata modificata; se è possibile che Word possa essere in esecuzione * mentre * la tua applicazione sta installando i font, questo è qualcosa da tenere a mente. –

3

Per prima cosa copiate il font nella cartella font di Windows, quindi chiamate AddFontResource usando p/invoke.

Ecco un esempio, è in C#, ma si dovrebbe essere in grado di lavorare fuori:

UPDATE

Nuovo URL

http://brutaldev.com/post/2009/03/26/Installing-and-removing-fonts-using-C.aspx

+2

Sei sicuro che funzionerà, nei documenti per AddFontResource (http://msdn.microsoft.com/en-us/library/dd183326%28v=vs.85%29.aspx)it dice * Questa funzione installa il font solo per la sessione corrente. Al riavvio del sistema, il font non sarà presente. Per avere il font installato anche dopo aver riavviato il sistema, il carattere deve essere elencato nel registro. * –

+0

Per essere disponibile dopo il riavvio del maching sarà necessario modificare la voce di registro appropriata in quel caso, (HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fonts) – Fermin

10

In primo luogo, è necessario copiare il carattere nella directory Windows \ Fonts (ti consigliamo di utilizzare il metodo Environment.GetFolderPath fornito da .NET Framework invece di codificare manualmente il percorso tipico della finestra s directory, nel caso in cui qualcosa sia diverso in uno degli ambienti dei tuoi utenti).

Quindi, è necessario chiamare il AddFontResource function per aggiungere il carattere alla tabella dei caratteri di sistema. Poiché lo standard AddFontResource è fornito dall'API di Windows, è necessario P/Invoke per chiamarlo dal codice VB.NET. La dichiarazione simile a questa (il parametro lpszFilename è il percorso del file di carattere che si desidera aggiungere):

<DllImport("gdi32.dll"), CharSet := CharSet.Auto> _ 
Public Shared Function AddFontResource(ByVal lpszFilename As String) As Integer 

Infine, se Word (o qualsiasi applicazione che si intende utilizzare il tipo di carattere in) è esecuzione nel momento in cui si chiama la funzione AddFontResource dal codice, è necessario informarlo che i caratteri disponibili sono stati modificati. A tale scopo, inviare un messaggio WM_FONTCHANGE a tutte le finestre di livello superiore utilizzando la funzione SendMessage e impostando il parametro hWnd su HWND_BROADCAST. Di nuovo, avrai bisogno di P/Invoke; le dichiarazioni di simile a questa:

Public Const HWND_BROADCAST As Integer = &HFFFF 
Public Const WM_FONTCHANGE As Integer = &H1D 

<DllImport("user32.dll"), CharSet := CharSet.Auto> _ 
Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer 

e si dovrebbe chiamare per inviare il messaggio di trasmissione in questo modo:

SendMessage(New IntPtr(HWND_BROADCAST), WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero) 

NOTA: I passaggi di cui sopra installare solo il tipo di carattere per la sessione corrente di Windows. Se è necessario che il carattere sia disponibile nei successivi riavvii, è necessario aggiungerlo al registro. La chiave da modificare è questa:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts 
+0

Stavo per chiedere come ottenere la directory dei caratteri dell'utente, grazie, ma non esiste alcuna proprietà per la cartella dei tipi di carattere che utilizza questo metodo: Environment.GetFolderPath (Environment.SpecialFolder. [Fonts]). Qualche idea? – Tom

+0

@ Tom: Sì, hai ragione che 'Environment.SpecialFolder' non espone la cartella dei caratteri. Ecco una spiegazione su come ottenere il modo * giusto * in .NET: http://www.atalasoft.com/cs/blogs/stevehawley/archive/2008/08/25/getting-the-fonts-folder. aspx (No, non basta aggiungere "' \ FONTS' "al percorso restituito da' SpecialFolder.System'.) –

+0

La documentazione MSDN è piuttosto confusa. [L'argomento di installazione dei font] (http://msdn.microsoft.com/en-us/library/dd144833.aspx) dice che copiare il file font in Windows \ Fonts, quindi chiamare AddFontResource ** installerà il font in modo permanente, ma la [pagina AddFontResource] (http://msdn.microsoft.com/en-us/library/dd183326.aspx) dice che il font deve essere elencato nel registro – MarkJ

0

ho usato il progetto di installazione per installare i font I necessario con la mia applicazione e seguito questo guide

Problemi correlati