.net 如何使Inno安装程序在执行长执行时看起来不冻结?
long.net 如何使Inno安装程序在执行长执行时看起来不冻结?,.net,installation,inno-setup,.net,Installation,Inno Setup,longExec正在安装.NET 3.5,out脚本基于此脚本: 问题是它使用的是ewwaitunterminated,因为我们需要捕获退出代码。我们运行它/passive/norestart,这样用户的工作量就少了(也许我们不应该这么做?) 我能想到的最简单的选择是在安装.NET时隐藏窗口,并在安装完成后再次显示,但我不知道如何做到这一点 理想的解决方案是显示一个进度页,但这似乎是不可能的,因为我们需要立即返回,但在流程退出时仍会收到通知并捕获退出代码,否则我们将只有一个永久的进度条 你有什
Exec
正在安装.NET 3.5,out脚本基于此脚本:
问题是它使用的是ewwaitunterminated
,因为我们需要捕获退出代码。我们运行它/passive/norestart
,这样用户的工作量就少了(也许我们不应该这么做?)
我能想到的最简单的选择是在安装.NET时隐藏窗口,并在安装完成后再次显示,但我不知道如何做到这一点
理想的解决方案是显示一个进度页,但这似乎是不可能的,因为我们需要立即返回,但在流程退出时仍会收到通知并捕获退出代码,否则我们将只有一个永久的进度条
你有什么想法吗
编辑:最小化可能会更好,但也不确定如何做到这一点。我们确实会显示一条消息,通知用户该过程可能需要10-20分钟,但问题是主设置窗体完全冻结,无法移动、最小化或对其执行任何操作。同时运行
/passive
的.NET安装程序在运行速度较慢的机器上实际上在一两分钟内不会显示任何进度。虽然这可能很容易,但我不建议在.NET安装程序运行时隐藏安装程序。我见过其他安装人员这样做,当它发生时,我认为安装已经完成,然后当我发现它真的没有完成时,我感到困惑。(当安装真正完成时,我也不能确定这一点。也许它只是再次隐藏了自己。)
您可以在Inno安装向导中显示自定义页面。让这样的页面显示进度条并保持其准确性可能是一个挑战,但至少您可以在向导页面上显示一条消息,说明您的安装程序正在等待.Net安装程序,然后再继续。请参阅帮助文件的“使用自定义向导页面”部分。我们需要安装带有两个产品的.NET,并采取了两种方法:
- 在使用Innosetup安装.NET时,我们会让用户知道安装需要很长时间,并且在安装完成后会收到特定消息
- 我们在没有任何标志的情况下启动.NET设置,以强制客户端通过它。这样,如果他们更倾向于技术,他们就会知道为什么安装需要这么长时间
老实说,我们在第二个选项上运气更好,尤其是现在更多的系统管理员似乎在一定程度上锁定了桌面。您只需调用
WizardForm.Hide;
Exec(...);
WizardForm.Show;
虽然我同意这不是很好。你问这个问题已经5年了,但这是我的答案 在调用Exec()之前,您可以设置Inno Setup将在主进度条上方显示的消息,如下所示:
WizardForm.StatusLabel.Caption := 'Installing .NET Framework 3.5. Please wait, this can take up to 1 hour...';
使Inno设置“看起来不冻结”的一种方法是添加一个“假”进度指示器,如一个字幕,以显示正在发生的事情。但这并不能解决“窗口不可拖动/可移动”的问题 因此,另一种方法是在执行长时间运行的过程时,真正解冻Inno Setup GUI: “长时间运行的进程”通过
ShellExecuteEx()
执行。
然后,安装程序对条件使用while循环
WaitForSingleObject
和非常小的超时
执行AppProcessMessage
AppProcessMessage
本身就是一个帮助函数。它使用“通用”代码重新创建应用程序。ProcessMessages
-ish过程,使用WinAPI函数PeekMessage()
、TranslateMessage()
和DispatchMessage()
。
它的工作是向Inno设置GUI发送消息
此技巧使窗口再次响应/拖动,
而“长时间运行的进程”是在后台处理的
这是执行循环的源:
如果ShellExecuteEx(ExecInfo)那么
开始
while WaitForSingleObject(ExecInfo.hProcess,100)=等待\u超时
一定要开始
AppProcessMessage;
WizardForm.Refresh();
结束;
CloseHandle(ExecInfo.hProcess);
结束;
以下是unzip.iss
的要点,其中包含独立版的代码,包括使用AppProcessMessage
函数的位和块
在本例中,“解压”只是一个示例,您可以使用.NET安装程序或任何其他长时间运行的任务替换已执行的应用程序。我们确实有类似的功能,但是,Exec运行在同一线程上,因此用户无法移动、调整大小、最小化或使用安装窗体执行任何操作。(我个人认为这很好,但我的老板对此表示不满,并坚称这是不可接受的)@Davy8:你的第一条评论并不完全正确——它运行在同一个线程上,但应用程序。ProcessMessages()是的,我们目前正在使用第一种方法,并考虑第二种方法,但不知道是否有更好的解决方案。我们刚刚花了一个下午安装了一个应用程序的演示,该应用程序在fi之后才警告我需要.NET 3.5rst强制重新启动…让我们只说用户可能会对意外的长时间子安装感到不安。但是,我没有技术上的答案。然后.NET也需要重新启动,之后原始应用程序的安装程序早就忘记了它正在运行,必须手动在临时文件夹中找到它,然后重新运行以实际安装该应用程序。是的h、 在安装框架之前,我们会通知该用户并允许他们取消。我们会抑制.net安装程序的重新启动,并在返回代码中捕获它,以便自己执行重新启动。除此之外,您也可以。此外,您应该存储
状态的标题