Fonts Inno安装-如何在安装开始前安装许多字体?

Fonts Inno安装-如何在安装开始前安装许多字体?,fonts,inno-setup,Fonts,Inno Setup,我想在安装程序开始之前安装一些字体,可以吗?如何在不安装外部字体的情况下为向导使用外部字体? 要将字体注册为某个进程的专用字体(在您的情况下是安装程序),您可以使用Windows API函数调用fl参数中指定的标志。它将允许您仅为流程使用字体。在下面的示例脚本中,显示了如何将字体提取到临时文件夹中,将其注册为安装过程的专用字体,以及如何将其加载到向导表单控件中: [Setup] AppName=My Program AppVersion=1.5 DefaultDirName={pf}\My Pr

我想在安装程序开始之前安装一些字体,可以吗?

如何在不安装外部字体的情况下为向导使用外部字体? 要将字体注册为某个进程的专用字体(在您的情况下是安装程序),您可以使用Windows API函数调用
fl
参数中指定的标志。它将允许您仅为流程使用字体。在下面的示例脚本中,显示了如何将字体提取到临时文件夹中,将其注册为安装过程的专用字体,以及如何将其加载到向导表单控件中:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: "MyFont.ttf"; Flags: dontcopy

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
const
  FR_PRIVATE = $10;
  FR_NOT_ENUM = $20;

function AddFontResourceEx(lpszFilename: string;
  fl: DWORD; pdv: Cardinal): Integer;
  external 'AddFontResourceEx{#AW}@gdi32.dll stdcall';
function RemoveFontResourceEx(lpFileName: string;
  fl: DWORD; pdv: Cardinal): BOOL;
  external 'RemoveFontResourceEx{#AW}@gdi32.dll stdcall';

var
  FontFlags: DWORD;

[Code]
procedure InitializeWizard;
var
  FontName: string;
begin
  // extract the font file to the temporary folder
  ExtractTemporaryFile('MyFont.ttf');
  // this combination specifies the reservation of this font for use
  // in the setup process and that this font cannot be enumerated
  FontFlags := FR_PRIVATE or FR_NOT_ENUM;
  // add the font resource
  if AddFontResourceEx(ExpandConstant('{tmp}\MyFont.ttf'),
    FontFlags, 0) <> 0 then
  begin
    // note, that this is the name of the font, which doesn't have
    // to match to the font file name
    FontName := 'My Font Name';
    // the global setting of the WizardForm.Font property causes many
    // of its child controls to inherit this font; except those listed
    // below; their default font has changed and they lost the ability
    // to inherit the font from their parent so we must do it manually
    WizardForm.Font.Name := FontName;
    WizardForm.WelcomeLabel1.Font.Name := FontName;
    WizardForm.PageNameLabel.Font.Name := FontName;
    WizardForm.FinishedHeadingLabel.Font.Name := FontName;
  end;
end;

procedure DeinitializeSetup;
begin
  // remove the font resource
  RemoveFontResourceEx(ExpandConstant('{tmp}\MyFont.ttf'),
    FontFlags, 0);
end;
[设置]
AppName=我的程序
AppVersion=1.5
DefaultDirName={pf}\My程序
[档案]
资料来源:“MyFont.ttf”;标志:dontcopy
[守则]
#ifdef UNICODE
#定义AW“W”
#否则
#定义“A”
#恩迪夫
常数
FR_PRIVATE=10美元;
FR_NOT_ENUM=$20;
函数AddFontResourceEx(lpszFilename:string;
fl:DWORD;pdv:Cardinal):整数;
外部“AddFontResourceEx{#AW}@gdi32.dll stdcall”;
函数RemoveFontResourceEx(lpFileName:string;
佛罗里达州:德沃德;pdv:红衣主教):布尔;
外部“RemoveFontResourceEx{#AW}@gdi32.dll stdcall”;
变量
方特旗:德沃德;
[守则]
程序初始化;
变量
字体名称:字符串;
开始
//将字体文件解压缩到临时文件夹
提取临时文件('MyFont.ttf');
//此组合指定保留此字体以供使用
//在安装过程中,无法枚举此字体
FontFlags:=FR_PRIVATE或FR_NOT_ENUM;
//添加字体资源
如果AddFontResourceEx(ExpandConstant('{tmp}\MyFont.ttf'),
FontFlags,0)0那么
开始
//请注意,这是字体的名称,它没有
//与字体文件名匹配
FontName:=“我的字体名称”;
//WizardForm.Font属性的全局设置会导致许多错误
//继承此字体的子控件的名称;除了列出的那些
//下面;他们的默认字体已更改,他们失去了该功能
//要从其父级继承字体,我们必须手动执行
WizardForm.Font.Name:=FontName;
WizardForm.WelcomeLabel1.Font.Name:=FontName;
WizardForm.PageNameLabel.Font.Name:=FontName;
WizardForm.FinishedHeadingLabel.Font.Name:=FontName;
结束;
结束;
程序去初始化设置;
开始
//删除字体资源
RemoveFontResourceEx(ExpandConstant({tmp}\MyFont.ttf'),
FontFlags,0);
结束;

是。这是可能的。问题是为什么要这样做。因为我希望安装程序的外观/主题使用不同的字体。我不确定每个人都会像我想的那样看到它。因此,在第一页显示之前,安装程序会快速安装字体。我使用了这个脚本|来源:“OZHANDIN.TTF”;DestDir:“{fonts}”;FontInstall:“Oz手工艺品BT”;Flags:onlyfdoesntexist uninseneveruninstall |但它仅在安装后工作。我用最简单的方法跳。提前感谢好吧,现在我明白了原因,但是,您确定要在目标系统上安装字体,只是为了让用户从您的设置中获得印象吗?就个人而言,我不喜欢这样,我会将这样的安装程序标记为恶意软件,因为在说“是”之前,我想安装你的应用程序。您将安装一种我不想在系统中使用的字体。您使用的主题插件是否能够直接从文件加载字体(因此您只需将其复制到临时文件夹)?你在使用哪个主题插件?谢谢你的回复兄弟。好的,那么如何将其解压缩到临时文件夹并将字体临时应用到我的主题?我不使用任何插件,我只是在.isl文件中编辑它并更改字体名称。它在已经安装了所需字体的我的电脑上工作。在脚本引擎触发任何事件之前加载*.isl文件中的字体,因此无法安装安装程序已尝试加载的字体。我马上回来解决问题……不客气!不久或稍后,您会发现消息对话框不使用您指定的字体。他们甚至不能。它是由设计和操作系统控制的。解决方案需要对
MessageBox
函数调用使用某种全局钩子,这不是与恶意软件检测软件保持友好关系的好方法。