nsis - 在 NSIS 中使用特定字体创建控制台应用程序的快捷方式
问题描述
我有一个 NSIS 脚本,它可以使用CreateShortCut
.
快捷方式指向的应用程序是一个控制台应用程序,但如果选择的默认字体以外的其他东西,它会更好地工作。当然,可以告诉用户按照https://www.isunshare.com/windows-10/change-font-and-font-size-in-windows-10-command-prompt.html之类的说明 更改为快捷方式上有不同的字体,但我的问题是这是否可以在 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
推荐阅读
- javascript - 仅通过javascript从网站上的json文件中提取信息
- amazon-web-services - 如何编写 ETL 作业以将 mysql 数据库表传输到另一个 mysql rds 数据库
- r - ggsurvplot:如何使 P 值加粗
- c - 如何将 500 个指针的一维数组传递给 C 中的函数
- node.js - 有时 node-rdkafka 消费者没有从主题中读取任何消息
- tfs - 如何在 TFS 2018.3(本地)中自定义迭代板上的列
- django - Django 使用 FilterSet 过滤布尔值
- c++ - 如何在字节类型数组中分配数据
- symfony - 如何覆盖 RedisAdapter 中的命名空间参数以使 Symfony4 应用程序缓存
- python - FileNotFoundError: [Errno 2] pydub 中没有这样的文件或目录