Installation 是否可以在Inno Setup的列表中显示安装操作?

Installation 是否可以在Inno Setup的列表中显示安装操作?,installation,inno-setup,Installation,Inno Setup,是否可以像在其他安装程序中一样列出进度 您可以监视向导窗体.StatusLabel和向导窗体.FilenameLabel中的更改,并将它们添加到自定义列表框进度视图中 const GWL_WNDPROC=-4; SB_VERT=1; SB_底部=7; WM_VSCROLL=$0115; WM_ERASEBKGND=$0014; 类型 WPARAM=UINT_PTR; LPARAM=长型; LRESULT=LongInt; 变量 OldStatusLabelWndProc:LongInt; Old

是否可以像在其他安装程序中一样列出进度


您可以监视
向导窗体.StatusLabel
向导窗体.FilenameLabel
中的更改,并将它们添加到自定义列表框进度视图中

const
GWL_WNDPROC=-4;
SB_VERT=1;
SB_底部=7;
WM_VSCROLL=$0115;
WM_ERASEBKGND=$0014;
类型
WPARAM=UINT_PTR;
LPARAM=长型;
LRESULT=LongInt;
变量
OldStatusLabelWndProc:LongInt;
OldFilenameLabelWndProc:LongInt;
OldProgressListBoxWndProc:LongInt;
ProgressListBox:TNewListBox;
状态:字符串;
文件名:字符串;
函数CallWindowProc(
lpPrevWndFunc:LongInt;hWnd:hWnd;Msg:UINT;wParam:wParam;
lParam:lParam):LRESULT;外部的CallWindowProcW@user32.dllstdcall';
函数SetWindowLong(hWnd:hWnd;nIndex:Integer;dwNewLong:LongInt):LongInt;
外部的SetWindowLongW@user32.dllstdcall';
过程AddProgress(S:字符串);
开始
如果是“”,那么
开始
ProgressListBox.Items.Add;
ProgressListBox.ItemIndex:=ProgressListBox.Items.Count;
SendMessage(ProgressListBox.Handle,WM_VSCROLL,SB_BOTTOM,0);
结束;
结束;
功能状态标签WNDPROC(
hwnd:hwnd;uMsg:UINT;wParam:wParam;lParam:lParam):LRESULT;
开始
结果:=CallWindowProc(OldStatusLabelWndProc、hwnd、uMsg、wParam、lParam);
如果是PrevStatus WizardForm.StatusLabel.Caption,则
开始
AddProgress(WizardForm.StatusLabel.Caption);
PrevStatus:=WizardForm.StatusLabel.Caption;
结束;
结束;
函数FilenameLabelWndProc(
hwnd:hwnd;uMsg:UINT;wParam:wParam;lParam:lParam):LRESULT;
开始
结果:=CallWindowProc(OldFilenameLabelWndProc、hwnd、uMsg、wParam、lParam);
如果是PrevFileName WizardForm.FilenameLabel.Caption,则
开始
AddProgress(WizardForm.FilenameLabel.Caption);
PrevFileName:=WizardForm.FilenameLabel.Caption;
结束;
结束;
函数ProgressListBoxWndProc(
hwnd:hwnd;uMsg:UINT;wParam:wParam;lParam:lParam):LRESULT;
开始
//减少闪烁
如果uMsg=WM_擦除BKGND,则
开始
结果:=1;
结束
其他的
开始
结果:=CallWindowProc(OldProgressListBoxWndProc、hwnd、uMsg、wParam、lParam);
结束;
结束;
过程初始化Wizard();
开始
OldStatusLabelWndProc:=
SetWindowLong(WizardForm.StatusLabel.Handle,GWL_WNDPROC,
CreateCallback(@StatusLabelWndProc));
OldFilenameLabelWndProc:=
SetWindowLong(WizardForm.FilenameLabel.Handle,GWL_WNDPROC,
CreateCallback(@filenamelablewndproc));
WizardForm.ProgressGauge.Top:=WizardForm.FilenameLabel.Top;
ProgressListBox:=TNewListBox.Create(WizardForm);
ProgressListBox.Parent:=WizardForm.ProgressGauge.Parent;
ProgressListBox.Top:=
WizardForm.ProgressGauge.Top+WizardForm.ProgressGauge.Height+ScaleY(8);
ProgressListBox.Width:=WizardForm.FilenameLabel.Width;
ProgressListBox。高度:=
ProgressListBox.Parent.ClientHeight-ProgressListBox.Top-ScaleY(16);
ProgressListBox.Anchors:=[akLeft、akTop、akRight、akBottom];
OldProgressListBoxWndProc:=
SetWindowLong(ProgressListBox.Handle,GWL_WNDPROC,
CreateCallback(@ProgressListBoxWndProc));
//将标签宽度缩小到列表框客户机宽度的Lame方法,
//因此,特别是当FilenameLabel中的文件路径缩短时
//为了适合标签,它们实际上甚至适合列表框。
WizardForm.StatusLabel.Width:=WizardForm.StatusLabel.Width-ScaleY(24);
WizardForm.FilenameLabel.Width:=WizardForm.FilenameLabel.Width-ScaleY(24);
结束;
过程去初始化设置();
开始
//如果您使用的是VCL样式或类似样式,则需要在
//您可以卸载样式。
SetWindowLong(WizardForm.StatusLabel.Handle、GWL_WNDPROC、OldStatusLabelWndProc);
SetWindowLong(WizardForm.FilenameLabel.Handle、GWL_WNDPROC、OldFilenameLabelWndProc);
SetWindowLong(ProgressListBox.Handle、GWL_WNDPROC、OldProgressListBoxWndProc);
结束;