NSIS从列表框读取选中值并写入注册表的实现方法
NSIS列表框获取选中值并写入注册表解决方案
核心思路
- NSIS的ListBox控件默认返回选中项的标签文本,无法直接获取关联的「值」,因此需要额外维护「值-索引」的映射关系
- 用NSIS 3支持的数组变量存储每个列表项对应的值,数组索引与列表项的索引一一对应
- 通过
LB_GETCURSEL消息获取选中项的索引,再通过索引从数组中取出对应的值,最后写入注册表
完整示例代码
!include "nsDialogs.nsh" !include "LogicLib.nsh" Var Dialog Var ListBoxHandle Var g_ValuesArray ; 存储所有列表项对应的值的数组 Page Custom CustomPageCreate CustomPageLeave Page InstFiles Function CustomPageCreate nsDialogs::Create 1018 Pop $Dialog ; 创建列表框(x, y, width, height) nsDialogs::CreateControl /NOUNLOAD "SysListView32" ${WS_BORDER}|${WS_VSCROLL}|${LBS_NOTIFY}|${WS_TABSTOP} 0 10 10 300 200 "" Pop $ListBoxHandle ; 初始化数组,存储300组值-标签(这里用循环模拟,实际替换为你的真实数据) StrCpy $g_ValuesArray "" Loop: IntOp $0 $0 + 1 ; 模拟值:比如"Value_$0",标签:"Label_$0" StrCpy $1 "Value_$0" StrCpy $2 "Label_$0" ; 添加标签到列表框 SendMessage $ListBoxHandle ${LB_ADDSTRING} 0 "STR:$2" ; 将对应的值存入数组(数组元素用|分隔,NSIS数组默认分隔符) StrCpy $g_ValuesArray "$g_ValuesArray|$1" ; 循环300次 IntCmp $0 300 "" "" Loop nsDialogs::Show FunctionEnd Function CustomPageLeave ; 获取选中项的索引 SendMessage $ListBoxHandle ${LB_GETCURSEL} 0 0 Pop $0 IntCmp $0 -1 NoSelection ; -1表示没有选中项 ; 根据索引从数组中取出对应的值 ${Array}::Get $g_ValuesArray $0 $1 ; 写入注册表(示例路径,替换为你的实际注册表路径) WriteRegStr HKCU "Software\YourApp" "SelectedValue" "$1" Goto EndLeave NoSelection: MessageBox MB_ICONWARNING "请选择一个选项!" Abort ; 阻止进入下一页 EndLeave: FunctionEnd Section SectionEnd
关键细节说明
- 如果使用传统NSIS页面(而非nsDialogs),获取列表框句柄的方式改为
FindWindow+GetDlgItem,核心逻辑一致 - 若你的「值-标签」是固定数据,可以提前把数组内容写死,不用循环生成
- 注意数组索引从0开始,和ListBox的项索引完全对应
LB_GETCURSEL返回-1时表示没有选中任何项,需添加判断避免错误写入
内容的提问来源于stack exchange,提问作者hhuntercu
相关产品推荐
相关产品推荐

