【问题标题】:Can I show the custom window before all the wizard pages in Inno Setup?我可以在 Inno Setup 中的所有向导页面之前显示自定义窗口吗?
【发布时间】:2025-12-13 13:45:03
【问题描述】:

我从dll 导出一个函数,如下所示:

function IsClientLaunched : Boolean;                                                  
external 'IsClientStarted@files:IsStart.dll stdcall setuponly';

我需要这个函数来检查我的应用程序是否已经在运行。如果它正在运行,它返回True,如果不是,它返回false。 我需要做的是取决于该功能的结果,我必须显示带有自定义消息和 2 个按钮的自定义窗口:ContinueCancel。因此,如果我关闭应用程序并按Continue,那么安装过程会继续进行。如果我按Cancel,那么安装程序将完成其工作并关闭。问题是我不知道如何在所有向导页面之前显示该自定义窗口,是否可以这样做?

另外,我使用 ISSI 来显示启动画面:

#define ISSI_Splash "C:\InnoSetupProject\Images\client.bmp"                    
#define ISSI_Splash_T 3                                                                      
#define ISSI_Splash_X 500                                                                     
#define ISSI_Splash_Y 220                                                                                                                                     

还有一个问题。如果我在第一个向导页面之前显示MsgBox 对话框并在其上按Cancel,我希望我的安装程序关闭,但它无论如何都会向我显示启动屏幕然后关闭。如果我在InitializeSetup 需要它,我可以以某种方式取消它吗?

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

    使用来自:
    Is it possible to check if program is already running before trying to install it? (Inno Setup)
    的代码(这是你的问题!)

    只需将IsAppRunning 替换为您的IsClientLaunched

    不过,现在的问题是,您是否需要自定义 IsClientLaunched。您可以改用IsAppRunning

    【讨论】:

    • 这里的主要内容是如何在所有其他向导页面之前显示我的自定义窗口。
    • 这正是代码的作用!你试过了吗? InitializeSetup 事件被触发甚至在安装向导显示之前
    • 是的,我确实尝试过,但它不会是自定义页面。这将是一个消息框,我只能从标准的一组按钮中进行选择,并且不能放置图像,例如,我还需要做的事情。
    • 要在语言对话框之前显示任何内容,您必须使用 hack 列表:Inno Setup - Language selector with VCL Styles。 – 但是,它不能是向导页面,它必须是自定义窗口/对话框。
    • 嗯,首先请注意,所有 Inno Setup 消息框都是如此(例如,AppMutex 的消息框或确认取消框都具有您的 Windows 语言的按钮)。而creating a custom dialog,您可以在其中本地化按钮不是问题。实际上 question I have posted above 正是这样做的。
    【解决方案2】:

    根据CreateCustomPage文档,创建自定义页面的参数如下:

    function CreateCustomPage(const AfterID: Integer;
                              const ACaption,
                              ADescription: String): TWizardPage;
    

    如您所见,您提供了AfterID,这意味着您可以告诉它在特定内置页面之后显示自定义页面。

    但是,您是否考虑过使用PrepareToInstall?它说:

    您可以使用此事件功能来检测和安装丢失的 先决条件和/或关闭任何将要运行的应用程序 更新了。

    所以也许您可以在那里进行测试并显示任何需要的弹出消息框。然后,根据回复,您可以返回相应的错误消息。文档解释了。

    可能还有其他方法可以做你想做的事。

    【讨论】:

    • AfterID 这意味着您可以告诉它在特定内置页面之前显示自定义页面。 - AfterID 如何暗示我 可以在内置页面之前显示自定义页面吗?
    • 对不起,我累了。我的意思是之后
    • 我认为我不能使用PrepareToInstall 函数,因为我需要在第一个向导页面出现之前进行所有检查。
    最近更新 更多