我正在研究NSIS安装程序。其中一个要求是允许用户多次输入一些信息用于多个不同的条目(实际上,它允许用户输入服务器信息,因为它们可以根据需要输入多个服务器)。我目前正在通过高级选项页面转到此页面来回收页面:
Function RedirectPage
${If} $addtCheck <> 0 ; Was the checkbox checked?
StrCpy $startedXml 1 ; make this "true"
SendMessage $HWNDPARENT 0x408 -1 "" ; If so, go back
${Else}
Abort
${EndIf}
FunctionEnd
addtCheck
检查是否勾选了回收页面的复选框。如果是这样,此功能会导致再次显示上一页。问题是这些字段包含用户刚刚输入的信息。现在,我想要做的是在返回之前清除上一页的所有字段的状态。我尝试过做这样的事情,
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioAdv.ini" "Field 2" "State" ""
但它似乎不允许我清除状态。我知道SendMessage
和GetDlgItem
命令,但我不知道任何允许我使用它们来清除InstallOptions INI文件中包含的文本框,复选框和列表框的方法。 / p>
任何能指出我正确方向的人,谢谢。如果你想再看到这个剧本,请告诉我。
答案 0 :(得分:2)
所以你应该在ini中拥有这样的控件:
[Field 1]
Type=Label
Left=15
Top=7
Right=112
Bottom=16
Text=Text 1
然后你可以像这样得到一个关于这个领域的句柄:
ReadIniStr $0 $PLUGINSDIR\page_ini.ini "Field 1" "HWND"
那么您可以使用SendMessage
命令$0
,如下所示:
SendMessage $0 ${WM_SETTEXT} 0 "STR:$InitialString"
此示例适用于文本框,其他控件请参阅以下内容:
在“包含”下的NSIS安装路径中,文件Winmessages.nsh
包含要使用的消息密钥。
在我的测试中,我找到了设置复选框的键:
SendMessage $0 ${BM_SETCHECK} 0 "0"
对于ListBoxes我发现:(未经测试)
LB_RESETCONTENT
LB_SELECTSTRING
希望有所帮助。 PS:如果您有任何问题或批评,请告诉我。
PPS:
或者,您可以将nsDialogs宏与HWND句柄一起使用,即用于复选框:
${NSD_Uncheck} $0
此宏的更多信息在这里: nsDialogs Readme - Macros
答案 1 :(得分:2)
您可以使用SendMessage重置每个控件,但是您必须处理不同类型的控件,只需重置.ini:
page custom custdircreate_1
page directory dirpagecreate
Function custdircreate_1
SetOverwrite on
!insertmacro INSTALLOPTIONS_EXTRACT "ioAdv.ini"
SetOverwrite lastused
!insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini"
FunctionEnd
Function dirpagecreate
SendMessage $HWNDPARENT 0x408 -1 ""
FunctionEnd
..或重置状态并保留其他所有内容:
Function custdircreate_2
; INSTALLOPTIONS_EXTRACT was called in .onInit
!insertmacro INSTALLOPTIONS_READ $1 "ioAdv.ini" "Settings" "NumFields"
StrCpy $0 1
loop:
!insertmacro INSTALLOPTIONS_WRITE "ioAdv.ini" "Field $0" "State" ""
IntOp $0 $0 + 1
IntCmpU $0 $1 loop loop
!insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini"
FunctionEnd
(这将重置链接和按钮控件,以便在需要时将其过滤掉)