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

如何在Inno Setup中仅勾选任务列表复选框,排除单选按钮

仅勾选Inno Setup任务列表中复选框的解决方案

无需Windows API的最优实现

直接利用Inno Setup内置函数判断任务类型,避免UI线程冲突和崩溃问题:

完整勾选函数代码

procedure CheckAllTasks();
var
  I: Integer;
  TaskName: string;
begin
  for I := 0 to WizardForm.TasksList.Items.Count - 1 do
  begin
    if WizardForm.TasksList.ItemEnabled[I] then
    begin
      TaskName := WizardForm.TasksList.Items[I].Name;
      // 仅勾选未设置exclusive标志的任务(即复选框类型)
      if GetTaskOption(TaskName, 'Flags') <> 'exclusive' then
      begin
        WizardForm.TasksList.Checked[I] := True;
      end;
    end;
  end;
end;

调用示例

比如在任务页面显示时自动执行勾选:

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectTasks then
  begin
    CheckAllTasks();
  end;
end;

原API方案崩溃原因分析

  1. 控件本质问题:TNewCheckListBox是自绘控件,列表项并非独立的Win32控件,WindowFromPoint无法获取到单个单选/复选框的句柄,只能拿到整个列表框的句柄,逻辑本身无效。
  2. 线程冲突:在Inno Setup的UI线程中直接调用WindowFromPoint等系统API,容易触发VCL控件的线程安全问题,导致卡顿和崩溃。

补充说明

  • 若存在分组的单选任务(多个exclusive任务共享同一组),该方案依然有效,只会跳过所有带有exclusive标志的单选任务,不影响原有单选分组的逻辑。
  • 该方法完全基于Inno Setup内置功能,兼容性更好,无需依赖系统API。

内容的提问来源于stack exchange,提问作者ElektroStudios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:30:17