Inno Setup隐藏UserInfoPage后部分设备出现名称必填和窗口聚焦报错
问题根因
- 报错You must enter a name:Inno Setup的
UserInfoPage默认强制校验姓名、组织字段为非空,即便你隐藏了对应输入控件,默认校验逻辑仍会生效,检测到字段为空就抛出错误。 - 报错Cannot focus a disabled or invisible window:默认校验失败后,安装程序会尝试将光标聚焦到未通过校验的姓名输入框,而该控件已被你隐藏,无法完成聚焦操作就抛出该异常。
- 同系统不同设备表现不一致:和Inno Setup运行时的控件加载时序、系统DPI配置、窗口渲染优先级的差异有关,本质是代码逻辑存在漏洞,不是设备兼容性问题。
修复方案
你只需要在隐藏姓名、组织控件的同时,给两个输入框预先填充任意非空值,绕过默认校验规则即可,不需要修改序列号验证的原有逻辑。
修正后的完整代码如下:
[Setup] WizardStyle=modern UserInfoPage=yes [Code] procedure CurPageChanged(CurPageID: Integer); begin if CurPageID = wpUserInfo then begin WizardForm.UserInfoOrgLabel.Hide(); WizardForm.UserInfoOrgEdit.Hide(); WizardForm.UserInfoNameLabel.Hide(); WizardForm.UserInfoNameEdit.Hide(); // 新增:给隐藏字段填充非空值,绕过默认非空校验 WizardForm.UserInfoNameEdit.Text := ' '; WizardForm.UserInfoOrgEdit.Text := ' '; end; end; // CheckSerial事件函数的存在会触发序列号输入框展示 // 这里先仅做非空判断,耗时的联网校验放在NextButtonClick中执行 function CheckSerial(Serial: String): Boolean; begin Result := (Serial <> ''); end; function NextButtonClick(CurPageID: Integer): Boolean; var WinHttpReq: Variant; Url: string; begin Result := True; if CurPageID = wpUserInfo then begin WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1'); Url := '你用于校验序列号的接口地址' + WizardForm.UserInfoSerialEdit.Text; WinHttpReq.Open('GET', Url, False); WinHttpReq.Send(''); // 根据服务端实现选择校验逻辑:可以用HTTP状态码,也可以用返回的响应内容 // 示例中用HTTP状态码判断:200表示序列号合法,其他状态码表示不合法,同时展示响应文本作为错误提示 Result := (WinHttpReq.Status = 200); if not Result then MsgBox(WinHttpReq.ResponseText, mbError, MB_OK); end; end;
内容的提问来源于stack exchange,提问作者Fabio Leça
相关产品推荐
相关产品推荐

