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

标签 .net windows vb.net fonts

需要在将使用我正在编写的应用程序的所有用户计算机上安装字体,该应用程序在 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/

相关文章:

.net - 有没有办法为元组项目指定有意义的名称?

java - 将多个 JFrame 中的值检索到单个 JFrame

linux - 没有用于 Windows 的 mremap?

.net - 强制 .NET Windows 应用程序。以英文形状显示数字

c# - RX Switch() 的订阅和取消订阅命令

c# - 使用 SQL 存储过程和 C# 读取大量数据 (SQL Server 2005)

c# - 使用 C# 求解偏微分方程

.net - SetThreadExecutionState(ES_SYSTEM_REQUIRED) 不会阻止 Windows 11 上的系统 sleep

windows - C++ : visual studio 2008/2010 "The breakpoint will not currently be hit." issue

vb.net - 获取 key 生成函数的反转