使用特定字体在NSIS中创建控制台应用程序的快捷方式

使用特定字体在NSIS中创建控制台应用程序的快捷方式,nsis,Nsis,我有一个NSIS脚本,可以使用CreateShortCut创建应用程序的快捷方式 快捷方式指向的应用程序是一个控制台应用程序,但是如果选择的不是默认字体,那么这个应用程序的效果会更好。当然,可以告诉用户按照指示操作,例如在快捷方式上更改为不同的字体,但我的问题是,在NSIS中是否可以自动更改?也就是说,检查特定字体是否可用,然后让快捷方式使用该字体启动控制台 如果在NSIS中无法对特定快捷方式执行此操作,是否有办法让用户选择在系统范围内更改所有终端中使用的字体?CreateShortcut指令仅

我有一个NSIS脚本,可以使用CreateShortCut创建应用程序的快捷方式

快捷方式指向的应用程序是一个控制台应用程序,但是如果选择的不是默认字体,那么这个应用程序的效果会更好。当然,可以告诉用户按照指示操作,例如在快捷方式上更改为不同的字体,但我的问题是,在NSIS中是否可以自动更改?也就是说,检查特定字体是否可用,然后让快捷方式使用该字体启动控制台

如果在NSIS中无法对特定快捷方式执行此操作,是否有办法让用户选择在系统范围内更改所有终端中使用的字体?

CreateShortcut指令仅支持基本快捷方式属性,不支持IShellLinkDataList设置

设置数据有两个问题:

这是全部或没有,你必须设置的大小,颜色和编辑选项,除了字体。 理想情况下,您应该在系统的控制台字体表中提供字体的索引,但该索引没有真正的文档化,我不知道如何从字体名称映射到索引。 如果仍要执行此操作,则必须使用系统插件:

!include LogicLib.nsh
!include Win\COM.nsh ; NSIS v3
!define /ifndef LF_FACESIZE 32
!define /ifndef NT_CONSOLE_PROPS_SIG 0xA0000002

Section

StrCpy $R1 "$Desktop\MyApp.lnk" ; .Lnk path
StrCpy $R3 "Consolas" ; Font name
StrCpy $R5 i0x36 ; tmPitchAndFamily?
StrCpy $R6 400 ; "The weight can range from 100 to 1000, in multiples of 100. For example, the normal weight is 400, while 700 is bold"
StrCpy $R7 0xc0000 ; dwFontSize packed COORD
StrCpy $R8 0x200060 ; dwWindowSize packed COORD

System::Call '*(&l4,i${NT_CONSOLE_PROPS_SIG}, i0xf50007,i0x3e70050,i$R8,i0x0,i0x0,i0x0,i$R7,i$R5,i$R6, &w${LF_FACESIZE}"$R3", i0x19,i0x0,i0x1,i0x1,i0x1,i0x32,i0x4,i0x1,i0x0,i0x800000,i0x8000,i0x808000,i0x80,i0x800080,i0x8080,i0xc0c0c0,i0x808080,i0xff0000,i0xff00,i0xffff00,i0xff,i0xff00ff,i0xffff,i0xffffff)p.R2'

!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 ""
${If} $0 P<> 0
    ${IShellLink::SetPath} $0 '("%COMSPEC%").r1'
    ${IShellLink::SetArguments} $0 '("/k echo HelloWorld").r2'
    ${If} $1 = 0
    ${AndIf} $2 = 0
        ${IUnknown::QueryInterface} $0 '("${IID_IShellLinkDataList}",.r1)'
        ${If} $1 P<> 0
            ${IShellLinkDataList::AddDataBlock} $1 '(pR2).r2'
            ${IUnknown::Release} $1 ""
        ${EndIf}
        ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)'
        ${If} $1 P<> 0
            ${IPersistFile::Save} $1 '("$R1",1).r2'
            ${IUnknown::Release} $1 ""
        ${EndIf}
    ${EndIf}
    ${IUnknown::Release} $0 ""
${EndIf}
System::Free $R2 ; Free NT_CONSOLE_PROPS

SectionEnd

谢谢你的帮助!