首页 > 解决方案 > 在 NSIS 中使用特定字体创建控制台应用程序的快捷方式

问题描述

我有一个 NSIS 脚本,它可以使用CreateShortCut.

快捷方式指向的应用程序是一个控制台应用程序,但如果选择的默认字体以外的其他东西,它会更好地工作。当然,可以告诉用户按照https://www.isunshare.com/windows-10/change-font-and-font-size-in-windows-10-command-prompt.html之类的说明 更改为快捷方式上有不同的字体,但我的问题是这是否可以在 NSIS 中自动化?也就是说,检查特定字体是否可用,然后让快捷方式使用该字体启动控制台。

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

标签: nsis

解决方案


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

设置NT_CONSOLE_PROPS数据有两个问题:

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

如果您仍然想这样做,那么您必须使用 System 插件:

!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

推荐阅读