如何在VB.NET中的用户机器上安装字体,以便像Word这样的应用程序可以使用它?

时间:2011-01-18 15:38:15

标签: .net windows vb.net fonts

需要在将使用我正在编写的应用程序的所有用户计算机上安装字体,该应用程序在Word中创建自定义文档。这是条形码字体。

我已成功将字体添加到我的解决方案中,并将其构建操作设置为Embedded Resource,并且还成功编写了代码以检查用户系统上是否已安装该字体。

现在我只需要弄清楚如何从我的解决方案中提取字体并将其安装到用户的计算机上,就像他们自己安装字体以便在Office应用程序中使用一样。

我发现的大多数例子都是在VB.NET应用程序中使用字体而不是在它之外,而我找到的那个似乎符合我的目的并不适合我。

4 个答案:

答案 0 :(得分:10)

首先,您需要将字体复制到Windows \ Fonts目录(您需要确保使用.NET Framework提供的Environment.GetFolderPath方法,而不是将典型路径硬编码到Windows目录,以防万一用户的环境有所不同。

然后,您需要调用AddFontResource function将字体添加到系统字体表中。由于AddFontResource由Windows API提供,因此您需要P / Invoke从VB.NET代码中调用它。声明看起来像这样(lpszFilename参数是您要添加的字体文​​件的路径):

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

最后,如果在您从代码中调用AddFontResource函数时,Word(或您打算使用该字体的任何应用程序)正在运行,您需要通知它可用的字体已更改。您可以使用WM_FONTCHANGE功能向所有顶级窗口发送SendMessage消息并将hWnd参数设置为HWND_BROADCAST来执行此操作。再次,你需要P / Invoke;声明如下:

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

你会把它叫做发送这样的广播信息:

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

注意:以上步骤仅安装当前Windows会话的字体。如果您需要在后续重新启动时使用该字体,则需要将其添加到注册表中。修改的关键是这一个:

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

答案 1 :(得分:3)

首先将字体复制到windows字体文件夹,然后使用p / invoke调用AddFontResource

这是一个例子,它在C#中,但你应该能够解决它:

<强>更新

新网址

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

答案 2 :(得分:2)

将字体复制到Windows字体文件夹中,然后您需要将字体添加到注册表中。我自己没有试过这个,但我认为可以通过使用ShellExecuteA api以与here类似的方式打开字体来实现这一点。

这是一个vbscript的做法,它可能作为起点很有用,因为你可以在VB.Net中使用类似的语法和函数:Hey, Scripting Guy! How Can I Install Fonts Using a Script?

答案 3 :(得分:0)

我使用安装程序项目来安装我的应用程序所需的字体,然后按照guide

进行操作