需要在所有用户的机器上安装一个字体,该字体将使用我正在编写的在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_BROADCAST
来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
首先,将字体复制到Windows字体文件夹,然后使用p / invoke调用AddFontResource 。
这里是一个例子,它在C#中,但你应该能够解决:
UPDATE
新的网址
http://brutaldev.com/post/2009/03/26/Installing-and-removing-fonts-using-C.aspx
我使用安装程序项目来安装我的应用程序所需的字体,并遵循本指南