需要在将使用我正在编写的应用程序的所有用户计算机上安装字体,该应用程序在 Word 中创建自定义文档。这是条形码字体。
我已成功将字体添加到我的解决方案并将其构建操作设置为嵌入式资源,并且还成功编写了代码来检查用户系统上是否已安装该字体。
现在我只需要弄清楚如何从我的解决方案中提取字体并将其安装到用户的机器上,就像他们自己安装字体以用于 Office 应用程序等一样。
我发现的大多数示例都是在 VB.NET 应用程序内而不是在应用程序外部使用字体,而我发现的那些似乎适合我的目的的示例并不适合我。
最佳答案
首先,您需要将字体复制到 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(或您打算在其中使用该字体的任何应用程序)正在运行,您需要通知它可用的字体已经改变。为此,您可以使用 SendMessage
函数将 WM_FONTCHANGE
消息发送到所有顶级窗口,并将 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 session 安装字体。如果您需要该字体在后续重新启动时可用,则需要将其添加到注册表中。修改的关键是这个:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
关于.net - 如何在 VB.NET 中的用户机器上安装字体以便 Word 等应用程序可以使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725950/