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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:36:07