0

There is a problem in making it easy for users to pass parameters to the program using the UI of NSIS text box.

It can be implemented in C # Winform, but it is not familiar with how to use it in NSIS.

I'd like to get help in one of two ways.

1. ONE :

I want to create a single Text box and separate the text I want to paste into a Text box with hyphens.

Example :

(1) The value you want to put into the text box : 12341234123412341234( Total 19 ~ 20 digits)

(2) Copy 12341234123412341234( Total 19 ~ 20 digits)

(3) Insert to Text box 1234-1234-1234-1234-1234 ( Autocomplete hyphenation in 4-digit units)

(4) Actual parameter value: 12341234123412341234

Visible values ​​in UI: 1234-1234-1234-1234-1234

Picture description:

Assuming the cmd input window ...

Text Box to show in real UI

2. TWO

(1) Copy 12341234123412341234

(2) Paste in first box of Text box

4 digits autocomplete

NSIS Text Box sample

Currently my code is trying Method 2.

My code:

Function Test
  !insertmacro MUI_INSTALLOPTIONS_READ $0 "pageInputLicenseInfo.ini" "Settings" "State"
  ${If} $0 == 9 # btton 
    !insertmacro MUI_INSTALLOPTIONS_READ $R0 "pageInputLicenseInfo.ini" "Field 1" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R1 "pageInputLicenseInfo.ini" "Field 2" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R2 "pageInputLicenseInfo.ini" "Field 3" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R3 "pageInputLicenseInfo.ini" "Field 4" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R4 "pageInputLicenseInfo.ini" "Field 5" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R5 "pageInputLicenseInfo.ini" "Field 6" "State"

    nsExec::ExecToStack '$INSTDIR\ParamterTestConsole.exe ${PRODUCT_NAME} $R0 $R1$R2$R3$R4$R5'

    Pop $2 ; Exit code
    Pop $3 ; console OUTPUT

    Blah blah..........

FunctionEnd

NSIS INI File:

; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=14
Title=test

[Field 1]
Type=Text
Text=1
Left=29
Right=275
Top=46
Bottom=57

[Field 2]
Type=Text
Text=123
Left=30
Right=60
Top=67
Bottom=78
MaxLen=4

[Field 3]
Type=Text
Text=123
Left=74
Right=103
Top=67
Bottom=78
MaxLen=4

[Field 4]
Type=Text
Text=123
Left=121
Right=149
Top=67
Bottom=78
MaxLen=4

[Field 5]
Type=Text
Text=123
Left=164
Right=193
Top=67
Bottom=78
MaxLen=4

[Field 6]
Type=Text
Text=123
Left=206
Right=236
Top=67
Bottom=78

[Field 7]
Type=Label
Text=IP
Left=1
Right=15
Top=48
Bottom=56

[Field 8]
Type=Label
Text=Key
Left=1
Right=20
Top=70
Bottom=78

[Field 9]
Type=Button
Text=enter
Flags=NOTIFY
Left=225
Right=275
Top=92
Bottom=105

[Field 10]
Type=Label
Text=※ 
Enter four digits.
Left=0
Right=152
Top=26
Bottom=43

[Field 11]
Type=Label
Text=-
Left=154
Right=160
Top=68
Bottom=80

[Field 12]
Type=Label
Text=-
Left=199
Right=205
Top=68
Bottom=76

[Field 13]
Type=Label
Text=-
Left=110
Right=116
Top=68
Bottom=76

[Field 14]
Type=Label
Text=-
Left=64
Right=70
Top=68
Bottom=76
SHO
  • 25
  • 8

1 Answers1

0

The PassDialog plug-in has a serial dialog that automatically moves to the next edit field when one is filled. I don't think it supports paste but you could perhaps ask the author to add this feature.

I don't think InstallOptions supports notify callbacks on edit boxes but nsDialogs does and you can create the classic serial input dialog with it:

Var Serial

!include LogicLib.nsh
!include WinMessages.nsh
!include nsDialogs.nsh
Page Custom MyDialogCreate MyDialogLeave
Page InstFiles

Function onSerialEditChange
Pop $R0
SendMessage $R0 ${EM_GETLIMITTEXT} 0 0 $R1
SendMessage $R0 ${WM_GETTEXTLENGTH} 0 0 $R2
${If} $R2 >= $R1
    SendMessage $hWndParent ${WM_NEXTDLGCTL} 0 0 ; Tab to next
${ElseIf} $R2 = 0
    SendMessage $hWndParent ${WM_NEXTDLGCTL} 1 0 ; Tab to previous
${EndIf}
FunctionEnd

Function MyDialogCreate
nsDialogs::Create 1018
Pop $0

!macro CreateSerialEdit x var limit
${NSD_CreateText} ${x} 10u 30u 12u ""
Pop ${var}
${NSD_OnChange} ${var} onSerialEditChange
${NSD_Edit_SetTextLimit} ${var} ${limit}
${NSD_AddStyle} ${var} ${ES_NUMBER} ; Limit to numbers
!macroend
!insertmacro CreateSerialEdit 10u $1 4
!insertmacro CreateSerialEdit 50u $2 4
!insertmacro CreateSerialEdit 90u $3 4

SendMessage $hWndParent ${WM_NEXTDLGCTL} $1 1
nsDialogs::Show
FunctionEnd

Function MyDialogLeave
StrCpy $Serial ""
${NSD_GetText} $1 $0
StrCpy $Serial "$Serial$0"
${NSD_GetText} $2 $0
StrCpy $Serial "$Serial$0"
${NSD_GetText} $3 $0
StrCpy $Serial "$Serial$0"
StrLen $0 $Serial
${If} $0 < 12
    MessageBox mb_iconstop "Enter a valid serial!"
    Abort
${EndIf}
FunctionEnd

Section
MessageBox mb_ok Serial=$Serial
SectionEnd

If you absolutely need to have the exact behavior you are describing then you need to create a custom plug-in that subclasses a edit box...

Anders
  • 97,548
  • 12
  • 110
  • 164
  • I am not good at English. Thank you for reading my question. The first thing I understand is that when I try to paste the Serial Key into the first column of the PassDialog plugin, it will not automatically include all posts. Second, is it true that you should try the classic nsDialogs implementation because of the limitations of InstallOptions? – SHO May 22 '19 at 00:50
  • Yes, that is correct. Choose the serial plug-in OR nsDialogs. – Anders May 22 '19 at 01:03