2011-01-18 14 views
5

Necesito instalar una fuente en todas las máquinas de los usuarios que usarán la aplicación que estoy escribiendo que crea documentos personalizados en Word. Es una fuente de código de barras.¿Cómo instalo una fuente en la máquina de un usuario en VB.NET para que aplicaciones como Word puedan usarla?

He agregado con éxito la fuente a mi solución y configuré su acción de compilación en Recurso incrustado y también he escrito correctamente el código para verificar si la fuente ya está instalada en el sistema del usuario.

Ahora sólo tiene que encontrar la manera de extraer la fuente de mi solución e instalarlo en la máquina del usuario como si se instalan la fuente a sí mismos para su uso en aplicaciones de oficina, etc.

La mayoría de los ejemplos que Descubrí que hay que usar la fuente dentro de la aplicación VB.NET en lugar de hacerlo fuera de ella, y la que he encontrado que parece ajustarse a mi propósito no me funciona.

+6

Solo para comentar que necesita asegurarse de que se le permite distribuir la fuente - las fuentes son software como su programa y necesita permiso antes de distribuir uno de la manera que describe. – Oded

+4

Este es el tipo de cosas que típicamente (y mejor) realiza un * instalador *, en lugar de su programa en sí. Por lo general, es más fácil decirle a su programa de instalación que instale una fuente que hacerlo desde su aplicación. –

+0

Eso sería genial, pero supongo que eso no es algo que se pueda hacer con el instalador ClickOnce que viene con Visual Studio 2010 ¿verdad? – Tom

Respuesta

2

Copiar la fuente en la carpeta de fuentes de Windows y luego tiene que conseguir la fuente añadido al registro.No lo he intentado yo mismo, pero creo que es posible hacerlo abriendo la fuente con la API ShellExecuteA de forma similar a la que se ve en here.

Aquí está una manera de hacerlo VBScript que podría ser útil como punto de partida, ya que podría ser capaz de utilizar la sintaxis y funciones similares en VB.Net: Hey, Scripting Guy! How Can I Install Fonts Using a Script?

+0

¿Por qué usaría la versión no Unicode de 'ShellExecute'? ¿Y cómo exactamente eso agrega la fuente al Registro? No veo eso dado como un ejemplo en el enlace que proporcionaste. –

+0

Esta es en realidad la solución más fácil. El comportamiento de este método es como si hiciera doble clic en la fuente en Windows que, si no le molesta, una barra de progreso de instalación emergente de Windows no está nada mal. Compruebe si existe la fuente, si no, copie el recurso en cualquier lugar, ejecute shellexecute y luego elimine el archivo de fuente extraído. – Tom

+0

Aún así, definitivamente debería usar la versión Unicode de 'ShellExecute'. Y no creo que esto informe a las aplicaciones en ejecución que la tabla de fuentes del sistema ha sido modificada; si es posible que Word se esté ejecutando * mientras * su aplicación está instalando fuentes, esto es algo a tener en cuenta. –

3

Primero copie la fuente en la carpeta de fuentes de windows y luego llame al AddFontResource usando p/invoke.

Aquí es un ejemplo, es en C#, sino que debe ser capaz de trabajar hacia fuera:

ACTUALIZACIÓN

Nueva URL

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

+2

¿Estas seguro que esto va a funcionar, en la documentación de AddFontResource (http://msdn.microsoft.com/en-us/library/dd183326%28v=vs.85%29.aspx)it dice * Esta función instala el fuente solo para la sesión actual. Cuando el sistema se reinicia, la fuente no estará presente. Para tener la fuente instalada incluso después de reiniciar el sistema, la fuente debe estar incluido en el registro. * –

+0

a estar disponible después de reiniciar el mecanizado tendrá que cambiar la entrada del registro apropiado en ese caso, (HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ windows NT \ CurrentVersion \ fonts) – Fermin

10

En primer lugar, tiene que copiar la fuente del directorio de Windows \ Fonts (querrá asegurarse de usar el método Environment.GetFolderPath proporcionado por .NET Framework en lugar de codificar la ruta típica de acceso a la ventana) s directorio, en caso de que algo sea diferente en uno de los entornos de los usuarios).

Luego, debe llamar al AddFontResource function para agregar la fuente a la tabla de fuentes del sistema. Como el API de Windows proporciona AddFontResource, necesitará P/Invoke para llamarlo desde el código VB.NET. La declaración se ve algo como esto (el parámetro lpszFilename es la ruta del archivo de fuente que desea agregar):

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

Por último, si Word (o cualquier aplicación que tiene la intención de utilizar la fuente en) es consecutivo en el momento en que llame a la función AddFontResource desde su código, debe informarle que las fuentes disponibles han cambiado. Para ello, envíe un mensaje WM_FONTCHANGE a todas las ventanas de nivel superior utilizando la función SendMessage y estableciendo el parámetro hWnd en HWND_BROADCAST. Nuevamente, necesitarás P/invocar; las declaraciones se ven así:

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 

Y lo llamarían para enviar el mensaje de difusión de esta manera:

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

NOTA: Los pasos anteriores sólo instalar la fuente para la sesión actual de Windows. Si necesita que la fuente esté disponible en reinicios posteriores, debe agregarla al registro. La clave para modificar es éste:

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

yo sólo iba a preguntar cómo llegar directorio de fuentes del usuario, gracias, pero no hay ninguna propiedad de la carpeta de fuentes usando este método:. Environment.GetFolderPath (Environment.SpecialFolder [Fuentes]). ¿Algunas ideas? – Tom

+0

@Tom: Sí, tienes razón en que 'Environment.SpecialFolder' no expone la carpeta de fuentes. Aquí hay una explicación de cómo hacerlo en * el * camino correcto en .NET: http://www.atalasoft.com/cs/blogs/stevehawley/archive/2008/08/25/getting-the-fonts-folder. aspx (No, no solo agrega "' \ FONTS' "a la ruta devuelta por' SpecialFolder.System'.) –

+0

La documentación de MSDN es bastante confusa. [El tema de instalación de la fuente] (http://msdn.microsoft.com/en-us/library/dd144833.aspx) dice que copiar el archivo de fuente a Windows \ Fonts y luego llamar a AddFontResource ** ** instalará la fuente de forma permanente, pero la [página AddFontResource] (http://msdn.microsoft.com/en-us/library/dd183326.aspx) dice que la fuente debe estar incluido en el registro – MarkJ

0

utilicé el proyecto de instalación para instalar los tipos de letra I necesario con mi aplicación y seguido esto guide

Cuestiones relacionadas