Inno setup 自定义卸载页面(非MsgBox)

Inno setup 自定义卸载页面(非MsgBox),inno-setup,Inno Setup,我需要在安装期间向用户请求密码,然后将其用作安装后运行的命令的一部分。我正在使用一个自定义页面来做这件事,它工作得很好 在卸载期间,我还需要问同样的问题,这是卸载后运行的命令的一部分 我已经查看了帮助,似乎没有用于卸载的PageID,我可以在我的CreateInputQuery函数中使用它。我并不特别介意页面是否显示在卸载的开始、中间或结束时,只要它是显示的 我不想使用MsgBox进行卸载,因为我想要标准页面的外观 关于如何实现这一点,有什么建议吗?我正在使用InnoSetup 5.4.2,文档

我需要在安装期间向用户请求密码,然后将其用作安装后运行的命令的一部分。我正在使用一个自定义页面来做这件事,它工作得很好

在卸载期间,我还需要问同样的问题,这是卸载后运行的命令的一部分

我已经查看了帮助,似乎没有用于卸载的PageID,我可以在我的
CreateInputQuery
函数中使用它。我并不特别介意页面是否显示在卸载的开始、中间或结束时,只要它是显示的

我不想使用
MsgBox
进行卸载,因为我想要标准页面的外观


关于如何实现这一点,有什么建议吗?

我正在使用InnoSetup 5.4.2,文档中有几个建议,包括: 过程CurUninstallStep已更改(CurUninstallStep:TUninstallStep)


您应该能够在[code]部分中创建输入页面

Inno当前不支持卸载期间的向导页面。您需要改用表单。

幸运的是,Inno安装程序提供了足够的能力来构建自己的表单,因此您可以在另一个模式表单上模拟卸载表单的任何页面。 这是我设法创造的。表单从
UninstallForm
中获取维度,包含一个
TNewNotebook
控件和按钮,用于在页面之间跳转和取消对话框

const
ControlGap=5;//经验性决定
//根据当前选择的笔记本页面设置后退/下一步按钮状态
程序updateButtonState(格式:TSetupForm);
变量
笔记本:TNewNotebook;
BtnBack,BtnNext:TButton;
开始
Notebook:=TNewNotebook(Form.FindComponent(“Notebook”);
BtnBack:=TButton(Form.FindComponent('BtnBack');
BtnNext:=TButton(Form.FindComponent('BtnNext');
//更新按钮状态
BtnBack.Enabled:=(Notebook.ActivePage Notebook.Pages[0]);
如果Notebook.ActivePage Notebook.Pages[Notebook.PageCount-1],则
开始
BtnNext.Caption:=设置消息(msgButtonNext)
BtnNext.ModalResult:=mrNone;
结束
其他的
开始
BtnNext.Caption:=设置消息(msgButtonFinish);
BtnNext.ModalResult:=mrYes;
结束;
结束;
//更改笔记本页面
过程BtnPageChangeClick(发送方:ToObject);
变量
下一页:TNewNotebookPage;
笔记本:TNewNotebook;
形式:双控;
按钮,BtnBack,BtnNext:t按钮;
开始
按钮:=t按钮(发送器);
形式:=按钮;
而不是(表单是TSetupForm)做什么
Form:=Form.Parent;
Notebook:=TNewNotebook(Form.FindComponent(“Notebook”);
BtnBack:=TButton(Form.FindComponent('BtnBack');
BtnNext:=TButton(Form.FindComponent('BtnNext');
//避免循环式的笔记本页面循环
如果(Button=BtnBack)和(Notebook.ActivePage=Notebook.Pages[0]),则
下一页:=无
其他的
如果(Button=BtnNext)和(Notebook.ActivePage=Notebook.Pages[Notebook.PageCount-1]),则
下一页:=无
其他的
下一页:=Notebook.FindNextPage(Notebook.ActivePage,Button=BtnNext);
Notebook.ActivePage:=下一页;
更新按钮状态(TSetupForm(Form));
结束;
//将新页面添加到笔记本并返回
函数AddPage(NotebookForm:TSetupForm):TNewNotebookPage;
变量
笔记本:TNewNotebook;
开始
笔记本:=TNewNotebook(NotebookForm.FindComponent('Notebook');
结果:=TNewNotebookPage.Create(笔记本);
结果.笔记本:=笔记本;
结果。父项:=笔记本;
结果.Align:=alClient;
如果Notebook.ActivePage=nil,则
Notebook.ActivePage:=结果;
更新按钮状态(NotebookForm);
结束;
//创建一个带有笔记本和3个按钮的表单:后退、下一步、取消
函数CreateNotebookForm:TSetupForm;
变量
笔记本:TNewNotebook;
NotebookPage:TNewNotebookPage;
Pan:TPanel;
TmpLabel:TLabel;
MaxWidth,i:整数;
BtnBack、BtnNext、BtnCancel:t按钮;
BtnLabelMsgIDs:TSetupMessageID的数组;
开始
结果:=CreateCustomForm;
Result.SetBounds(0,0,UninstallProgressForm.Width,UninstallProgressForm.Height);
结果.位置:=poOwnerFormCenter;
笔记本:=TNewNotebook.Create(结果);
Notebook.Parent:=结果;
笔记本。名称:=“笔记本”;//将用于搜索
Notebook.Align:=alClient;
Pan:=TPanel.Create(结果);
Pan.Parent:=笔记本;
标题:='';
平移对齐:=alBottom;
//创建按钮
BtnNext:=TNewButton.Create(结果);
用BtnNext做
开始
家长:=Pan;
名称:='BtnNext';//将用于搜索
标题:=设置消息(msgButtonNext);
OnClick:=@BtnPageChangeClick;
ParentFont:=True;
结束;
BtnBack:=TNewButton.Create(结果);
用BtnBack做
开始
家长:=Pan;
标题:=设置消息(msgButtonBack);
名称:=“BtnBack”;//将用于搜索
OnClick:=@BtnPageChangeClick;
ParentFont:=True;
结束;
BtnCancel:=TNewButton.Create(结果);
用BtnCancel do
开始
家长:=Pan;
名称:=“BtnCancel”;//将用于搜索
标题:=设置消息(msgButtonCancel);
ModalResult:=mrCancel;
取消:=真;
ParentFont:=True;
结束;
//确定按钮的尺寸。此处应使用TCanvas.TextWidth
//但它不允许字体属性分配:(
TmpLabel:=TLabel.Create(结果);
用TmpLabel做
开始
左:=0;
顶部:=0;
家长:=Pan;
ParentFont:=True;
可见:=假;
wrap:=False;
自动调整大小:=真;
结束;
//确定这些标签中的最大标签宽度:后退、下一步、取消、完成
设置阵列长度(BtnLabelMsgIDs,4);
BtnLabelMsgIDs[0]:=msgButtonBack;
BtnLabelMsgIDs[1]:=msgButtonNext;
BtnLabelMsgIDs[2]:=msgButtonCancel;
BtnLabelMsgIDs[3]:=msgButtonFinish;
最大宽度:=0;
对于i:=低(BtnLabelMsgIDs)到高(BtnLabelMsgIDs)do
开始
TmpLabel.Caption:=SetupMessage(BtnLabelMsgIDs[i])+'WWW';//为周围的空格添加字母
如果MaxWidth