如何在VB.NET中的用户计算机上安装字体,以便Word等应用程序可以使用它?

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

我已成功将字体添加到我的解决scheme,并将其构build操作设置为Embedded Resource,并成功编写代码以检查字体是否已安装在用户的系统上。

现在,我只需要弄清楚如何从我的解决scheme中提取字体,并将其安装到用户的机器上,就好像他们自己安装了用于Office应用程序的字体一样。

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

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

这里有一个VBScript的做法,可能是有用的起点,因为你可能能够在VB.Net中使用类似的语法和功能: 嘿,脚本专家! 如何使用脚本安装字体?

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

然后,您需要调用AddFontResource函数将字体添加到系统字体表。 由于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(或任何您打算使用该字体的应用程序)正在运行 ,则需要通知它可用的字体已更改。 您可以通过使用SendMessage函数向所有顶级窗口发送WM_FONTCHANGE消息并将hWnd参数设置为HWND_BROADCASTHWND_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 

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

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

UPDATE

新的网址

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

我使用安装程序项目来安装我的应用程序所需的字体,并遵循本指南