Tom*_*Tom 5 .net vb.net windows fonts
需要在将使用我正在编写的应用程序的所有用户的计算机上安装字体,该应用程序在Word中创建自定义文档.这是条形码字体.
我已成功将字体添加到我的解决方案中,并将其构建操作设置为Embedded Resource,并且还成功编写了代码以检查用户系统上是否已安装该字体.
现在我只需要弄清楚如何从我的解决方案中提取字体并将其安装到用户的计算机上,就好像他们自己安装了字体一样用于Office应用程序等.
我发现的大多数例子都是在VB.NET应用程序中使用字体而不是在它之外,而我找到的那个似乎符合我目的的那些不适合我.
Cod*_*ray 10
首先,您需要将字体复制到Windows\Fonts目录(您需要确保使用Environment.GetFolderPath.NET Framework提供的方法,而不是硬编码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
Run Code Online (Sandbox Code Playgroud)
最后,如果在您从代码中调用函数时Word(或您打算使用该字体的任何应用程序)正在运行,则AddFontResource需要通知它可用字体已更改.您可以通过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
Run Code Online (Sandbox Code Playgroud)
你会把它叫做发送这样的广播信息:
SendMessage(New IntPtr(HWND_BROADCAST), WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero)
Run Code Online (Sandbox Code Playgroud)
注意:以上步骤仅安装当前Windows会话的字体.如果您需要在后续重新启动时使用该字体,则需要将其添加到注册表中.修改的关键是这一个:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
Run Code Online (Sandbox Code Playgroud)
将字体复制到Windows字体文件夹中,然后您需要将字体添加到注册表中。我自己没有尝试过,但我认为可以通过使用 api 打开字体来实现此目的,ShellExecuteA方式与此处所示类似。
这是一种 VBScript 方法,作为起点可能会很有用,因为您可能能够在 VB.Net 中使用类似的语法和函数:嘿,脚本专家!如何使用脚本安装字体?