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

时间:2018-08-27 18:37:43

标签: nsis

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

该快捷方式指向的应用程序是一个控制台应用程序,但是如果选择的字体不是默认字体,则该应用程序会更好。当然,可以告诉用户遵循https://www.isunshare.com/windows-10/change-font-and-font-size-in-windows-10-command-prompt.html之类的说明来更改快捷方式上的其他字体,但是我的意思是,是否可以在NSIS中将其自动化?也就是说,检查特定字体是否可用,然后让快捷方式使用该字体启动控制台。

如果对于特定的快捷方式在NSIS中是不可能的,是否有办法让用户选择对所有终端中使用的字体进行系统范围的更改?

1 个答案:

答案 0 :(得分:1)

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

设置NT_CONSOLE_PROPS数据有两个问题:

  • 是全部还是全部,除了字体之外,您还需要设置大小,颜色和编辑选项。
  • 理想情况下,您应该提供“系统控制台字体表中字体的索引”,但是该索引并未真正记录,并且我不知道如何从字体名称映射到索引。

如果您仍然想要这样做,则必须使用系统插件:

!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