从代码更改组件复选框状态后的 Inno Setup 更新磁盘 space
Inno Setup update disk space after changing components checkbox state from code
我得到了我可以 select 安装的组件(应用程序)列表(默认情况下它们都被选中)并且所有这些组件都得到了 ExtraDiskSpaceRequired
。一开始,我动态地更改哪些应用程序应该被选中或取消选中,具体取决于它们是否已安装以及其他一些条件。
现在的问题是,当我在开始时从代码中检查组件(TNewCheckListBox
项)时 "Disk space required" 标签不会更新,直到我通过鼠标或键盘从列表中更改某些复选框的状态。
我尝试用以下方法修复它:
WizardForm.Repaint
和其他类似的方法
- 显示该页面时更改复选框的状态
尝试用 SendInput
从 Windows API 上下发送 Space 按钮,但 returns 0(未按下).当显示 wpSelectComponents 时,我在 CurPageChanged
函数中调用了 SendInput
,并从 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 选中
- 磁盘space标签12MB
启动时通过代码更改状态后的示例:
- CheckBox1 5MB 选中
CheckBox2 7MB 未选中
磁盘 space 标签仍然是 12MB,直到我通过鼠标或键盘更改复选框的状态
注意:我使用的是Inno Setup 5.6.1 (u),暂时无法更新。
更新列表复选框的状态后触发 TNewCheckListBox.OnClickCheck
事件:
WizardForm.ComponentsList.OnClickCheck(WizardForm.ComponentsList);
我得到了我可以 select 安装的组件(应用程序)列表(默认情况下它们都被选中)并且所有这些组件都得到了 ExtraDiskSpaceRequired
。一开始,我动态地更改哪些应用程序应该被选中或取消选中,具体取决于它们是否已安装以及其他一些条件。
现在的问题是,当我在开始时从代码中检查组件(TNewCheckListBox
项)时 "Disk space required" 标签不会更新,直到我通过鼠标或键盘从列表中更改某些复选框的状态。
我尝试用以下方法修复它:
WizardForm.Repaint
和其他类似的方法- 显示该页面时更改复选框的状态
尝试用
SendInput
从 Windows API 上下发送 Space 按钮,但 returns 0(未按下).当显示 wpSelectComponents 时,我在CurPageChanged
函数中调用了SendInput
,并从 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 选中
- 磁盘space标签12MB
启动时通过代码更改状态后的示例:
- CheckBox1 5MB 选中
CheckBox2 7MB 未选中
磁盘 space 标签仍然是 12MB,直到我通过鼠标或键盘更改复选框的状态
注意:我使用的是Inno Setup 5.6.1 (u),暂时无法更新。
更新列表复选框的状态后触发 TNewCheckListBox.OnClickCheck
事件:
WizardForm.ComponentsList.OnClickCheck(WizardForm.ComponentsList);