3

我得到了一个可以选择安装的组件(应用程序)列表(默认情况下它们都被选中),所有这些组件都得到了ExtraDiskSpaceRequired. 一开始,我会根据是否安装和其他一些条件动态更改应选中或取消选中的应用程序。

现在的问题是,当我TNewCheckListBox在开始时从代码中检查组件(项目)时,“需要磁盘空间”标签不会更新,直到我通过鼠标或键盘从列表中更改某些复选框的状态。

我试图用以下方法修复它:

  • WizardForm.Repaint和其他类似的方法
  • 显示该页面时更改复选框的状态
  • 尝试从 Windows API 向下和向上发送 Space 按钮,SendInput但它返回 0(未按下)。我SendInputCurPageChanged显示 wpSelectComponents 时调用函数并从 Timer

    我用于的代码SendInput

    type
        TKeyboardInput = record
            Itype: DWORD;    
            wVk: WORD;
            wScan: WORD;
            dwFlags: DWORD;
            time: DWORD;
            dwExtraInfo: DWORD;
        end;
    
    function SendInput(nInputs: UINT; pInputs: TKeyboardInput;
        cbSize: Integer): UINT; 
        external 'SendInput@user32.dll stdcall';
    
    function SendKeyPressed(KeyCode: Word): Boolean;
    var
        InputDown: TKeyboardInput;
        InputUp: TKeyboardInput;
    begin
        Result := False;
    
        InputDown.Itype := 1;
        InputDown.wVk := KeyCode;
        InputDown.wScan := 0;
        InputDown.time := 0;
        InputDown.dwFlags := 0;
    
        InputUp.Itype := 1;
        InputUp.wVk := KeyCode;
        InputUp.wScan := 0;
        InputUp.time := 0;
        InputUp.dwFlags := 2;
    
        MsgBox(IntToStr(SendInput(1, InputDown, SizeOf(InputDown))),
          mbInformation, MB_OK);
        Result := SendInput(1, InputUp, SizeOf(InputUp)) = 1;
        if Result then
        begin
            MsgBox('Test2', mbInformation, MB_OK);
        end;
    end;
    

知道如何解决这个问题吗?

默认示例:

  • CheckBox1 5MB 已选中
  • CheckBox2 7MB 已选中
  • 磁盘空间标签 12MB

在启动时通过代码更改状态后的示例:

  • CheckBox1 5MB 已选中
  • CheckBox2 7MB 未选中

  • 在我通过鼠标或键盘更改复选框状态之前,磁盘空间标签仍为 12MB

注意:我正在使用 Inno Setup 5.6.1 (u),暂时无法更新。

4

1 回答 1

2

TNewCheckListBox.OnClickCheck更新列表复选框的状态后触发事件:

WizardForm.ComponentsList.OnClickCheck(WizardForm.ComponentsList);
于 2020-05-12T12:43:16.800 回答