Inno Setup中序列号的CustomPage

如何使用编辑序列号创buildInno Setup中的CustomPage? 例如6x5chars或7x5chars?

下一个button变为可用之前,脚本应该检查是否所有的框都被填充

如果可以实现复制/粘贴function,如果剪贴板内容匹配序列号码模式,则可以填满所有编辑框,这也是很好的。

以下是使用创build单独编辑框的自定义页面的一种方法。 您只需要为定义编辑框数量的SC_EDITCOUNT常量指定值,而SC_EDITCOUNT可以在这些编辑框中input的字符数是多less。 如果你在第一个编辑框中,你可以粘贴整个序列号,如果它的格式是由- char(这里的TryPasteSerialNumber函数)分隔的格式。 为了从编辑框中获得序列号,只需调用GetSerialNumber就足够了,您可以在其中指定输出格式的分隔符(如果需要)。

 [Setup] AppName=Serial number project AppVersion=1.0 DefaultDirName={pf}\Serial number project [code] function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall'; function OpenClipboard(hWndNewOwner: HWND): BOOL; external 'OpenClipboard@user32.dll stdcall'; function GetClipboardData(uFormat: UINT): THandle; external 'GetClipboardData@user32.dll stdcall'; function CloseClipboard: BOOL; external 'CloseClipboard@user32.dll stdcall'; function GlobalLock(hMem: THandle): PAnsiChar; external 'GlobalLock@kernel32.dll stdcall'; function GlobalUnlock(hMem: THandle): BOOL; external 'GlobalUnlock@kernel32.dll stdcall'; var SerialPage: TWizardPage; SerialEdits: array of TEdit; const CF_TEXT = 1; VK_BACK = 8; SC_EDITCOUNT = 6; SC_CHARCOUNT = 5; SC_DELIMITER = '-'; function IsValidInput: Boolean; var I: Integer; begin Result := True; for I := 0 to GetArrayLength(SerialEdits) - 1 do if Length(SerialEdits[I].Text) < SC_CHARCOUNT then begin Result := False; Break; end; end; function GetClipboardText: string; var Data: THandle; begin Result := ''; if OpenClipboard(0) then try Data := GetClipboardData(CF_TEXT); if Data <> 0 then Result := String(GlobalLock(Data)); finally if Data <> 0 then GlobalUnlock(Data); CloseClipboard; end; end; function GetSerialNumber(ADelimiter: Char): string; var I: Integer; begin Result := ''; for I := 0 to GetArrayLength(SerialEdits) - 1 do Result := Result + SerialEdits[I].Text + ADelimiter; Delete(Result, Length(Result), 1); end; function TrySetSerialNumber(const ASerialNumber: string; ADelimiter: Char): Boolean; var I: Integer; J: Integer; begin Result := False; if Length(ASerialNumber) = ((SC_EDITCOUNT * SC_CHARCOUNT) + (SC_EDITCOUNT - 1)) then begin for I := 1 to SC_EDITCOUNT - 1 do if ASerialNumber[(I * SC_CHARCOUNT) + I] <> ADelimiter then Exit; for I := 0 to GetArrayLength(SerialEdits) - 1 do begin J := (I * SC_CHARCOUNT) + I + 1; SerialEdits[I].Text := Copy(ASerialNumber, J, SC_CHARCOUNT); end; Result := True; end; end; function TryPasteSerialNumber: Boolean; begin Result := TrySetSerialNumber(GetClipboardText, SC_DELIMITER); end; procedure OnSerialEditChange(Sender: TObject); begin WizardForm.NextButton.Enabled := IsValidInput; end; procedure OnSerialEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var Edit: TEdit; EditIndex: Integer; begin Edit := TEdit(Sender); EditIndex := Edit.TabOrder - SerialEdits[0].TabOrder; if (EditIndex = 0) and (Key = Ord('V')) and (Shift = [ssCtrl]) then begin if TryPasteSerialNumber then Key := 0; end else if (Key >= 32) and (Key <= 255) then begin if Length(Edit.Text) = SC_CHARCOUNT - 1 then begin if EditIndex < GetArrayLength(SerialEdits) - 1 then SetFocus(SerialEdits[EditIndex + 1].Handle) else SetFocus(WizardForm.NextButton.Handle); end; end else if Key = VK_BACK then if (EditIndex > 0) and (Edit.Text = '') and (Edit.SelStart = 0) then SetFocus(SerialEdits[EditIndex - 1].Handle); end; procedure CreateSerialNumberPage; var I: Integer; Edit: TEdit; DescLabel: TLabel; EditWidth: Integer; begin SerialPage := CreateCustomPage(wpWelcome, 'Serial number validation', 'Enter the valid serial number'); DescLabel := TLabel.Create(SerialPage); DescLabel.Top := 16; DescLabel.Left := 0; DescLabel.Parent := SerialPage.Surface; DescLabel.Caption := 'Enter valid serial number and continue the installation...'; DescLabel.Font.Style := [fsBold]; SetArrayLength(SerialEdits, SC_EDITCOUNT); EditWidth := (SerialPage.SurfaceWidth - ((SC_EDITCOUNT - 1) * 8)) div SC_EDITCOUNT; for I := 0 to SC_EDITCOUNT - 1 do begin Edit := TEdit.Create(SerialPage); Edit.Top := 40; Edit.Left := I * (EditWidth + 8); Edit.Width := EditWidth; Edit.CharCase := ecUpperCase; Edit.MaxLength := SC_CHARCOUNT; Edit.Parent := SerialPage.Surface; Edit.OnChange := @OnSerialEditChange; Edit.OnKeyDown := @OnSerialEditKeyDown; SerialEdits[I] := Edit; end; end; procedure CurPageChanged(CurPageID: Integer); begin if CurPageID = SerialPage.ID then WizardForm.NextButton.Enabled := IsValidInput; end; procedure InitializeWizard; begin CreateSerialNumberPage; end; 

这里是这样的:

在这里输入图像描述

你可以让Inno通过添加一个CheckSerial()事件函数来提示用户input一个串行密钥。

如果您希望对页面进行更多控制,则可以使用CreateCustomPage()中的某个库存页面( CreateInput...Page )或设置向导中的自定义页面,并根据需要添加控件。

请参阅Inno安装程序附带的codedlg.iss示例。

在“名称”和“组织”文本字段下方添加串行密钥框的最简单方法是在iss文件中添加以下内容。

 [Code] function CheckSerial(Serial: String): Boolean; begin // serial format is XXXX-XXXX-XXXX-XXXX Serial := Trim(Serial); if Length(Serial) = 19 then result := true; end; 

这可以有用地结合起来

 [Setup] DefaultUserInfoSerial={param:Serial} 

如果以前input了安装,将会填入序列号。