You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:35:38