Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在用户';那么像Word这样的应用程序可以使用它吗?_.net_Windows_Vb.net_Fonts - Fatal编程技术网

.net 如何在用户';那么像Word这样的应用程序可以使用它吗?

.net 如何在用户';那么像Word这样的应用程序可以使用它吗?,.net,windows,vb.net,fonts,.net,Windows,Vb.net,Fonts,需要在所有使用我正在编写的应用程序的用户机器上安装字体,该应用程序在Word中创建自定义文档。这是一种条形码字体 我已经成功地将字体添加到我的解决方案中,并将其构建操作设置为Embedded Resource,还成功地编写了代码来检查字体是否已安装在用户系统上 现在,我只需要弄清楚如何从我的解决方案中提取字体,并将其安装到用户的机器上,就像他们自己安装字体以用于Office应用程序等 我发现的大多数示例都是在VB.NET应用程序中而不是在其外部使用字体,我发现的似乎符合我的目的的示例对我不起作用

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

我已经成功地将字体添加到我的解决方案中,并将其构建操作设置为Embedded Resource,还成功地编写了代码来检查字体是否已安装在用户系统上

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


我发现的大多数示例都是在VB.NET应用程序中而不是在其外部使用字体,我发现的似乎符合我的目的的示例对我不起作用。

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

下面是一个例子,用C#表示,但您应该能够计算出来:

更新

新网址


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

下面是一个例子,用C#表示,但您应该能够计算出来:

更新

新网址


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

然后,需要调用将字体添加到系统字体表中。由于
AddFontResource
是由Windows API提供的,因此需要P/Invoke从VB.NET代码中调用它。声明如下所示(lpszFilename参数是要添加的字体文件的路径):

您可以调用它来发送如下广播消息:

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\Fonts目录(您需要确保使用.NET Framework提供的方法,而不是硬编码到Windows目录的典型路径,以防某个用户环境中出现不同的情况)

然后,需要调用将字体添加到系统字体表中。由于
AddFontResource
是由Windows API提供的,因此需要P/Invoke从VB.NET代码中调用它。声明如下所示(lpszFilename参数是要添加的字体文件的路径):

您可以调用它来发送如下广播消息:

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字体文件夹中,然后需要将字体添加到注册表中。我自己也没有尝试过,但我认为可以通过使用
ShellExecuteA
api打开字体来实现这一点,方法与前面看到的类似


下面是一种vbscript方法,它可能是一个有用的起点,因为您可以在VB.Net中使用类似的语法和函数:

将字体复制到Windows字体文件夹中,然后需要将字体添加到注册表中。我自己也没有尝试过,但我认为可以通过使用
ShellExecuteA
api打开字体来实现这一点,方法与前面看到的类似


下面是一个vbscript方法,它可能是一个有用的起点,因为您可能可以在VB.Net中使用类似的语法和函数:

我使用安装程序项目来安装我的应用程序所需的字体,并遵循此方法

我使用安装程序项目来安装我的应用程序和应用程序所需的字体遵循此

只是为了说明,您需要确保允许分发字体-字体是与您的程序一样的软件,并且在按照您描述的方式分发字体之前,您需要获得许可。这类事情通常(最好)由安装程序完成,而不是由您的程序本身完成。告诉你的安装程序安装字体通常比在你的应用程序中安装字体更容易。那很好,但我认为这不是用Visual Studio 2010附带的ClickOnce安装程序可以完成的事情,对吧?只是为了说明你需要确保允许分发字体字体软件就像你的程序一样,在按照你描述的方式发布之前,你需要获得许可。这是一种典型的(也是最好的)由安装程序完成的事情,而不是你的程序本身。告诉您的安装程序安装字体通常比在应用程序中安装字体更容易。这很好,但我认为Visual Studio 2010附带的ClickOnce安装程序不能做到这一点,对吧?在AddFontResource的文档中,您确定这会行得通吗(表示此函数仅为当前会话安装字体。当系统重新启动时,字体将不存在。要在重新启动系统后安装字体,必须在注册表中列出字体。在这种情况下,要在重新启动计算机后可用,您需要更改相应的注册表项,(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts)在AddFontResource的文档中,您确定这会起作用吗(表示此函数仅为当前会话安装字体。当系统重新启动时,字体将不存在。要在重新启动后安装字体吗