你如何讓 Inno Setup 在執行長執行時看起來不凍結?
長期
Exec安裝.NET 3.5,輸出腳本基於此: http: //www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/問題在於它正在使用
ewWaitUntilTerminated,因為我們需要擷取退出程式碼。由於我們正在執行它/passive /norestart以減少使用者方面的工作(也許我們不應該?)我能想到的最簡單的選擇是在安裝.NET 時隱藏視窗並在完成後再次顯示它,但我不知道該怎麼做。
理想的解決方案是顯示一個進度頁面,但這似乎不太可能,因為我們需要立即返回,但在程序退出時仍會以某種方式收到通知並擷取退出程式碼,否則我們會只是有一個永恆的進度條。
關於如何解決這個問題的任何想法?
編輯:最小化可能會更好,但也不知道該怎麼做。我們確實會顯示一條消息,通知使用者該過程可能需要 10-20 分鐘,但問題是主設置表單完全凍結,無法移動、最小化或對其進行任何操作。此外
/passive,在較慢的機器上執行 .NET 安裝程序實際上並不會在一兩分鐘內顯示任何進度。
使 Inno Setup“看起來不凍結”的一種方法是添加一個“假”進度指示器,如選取框,以顯示正在發生的事情。但這並不能解決“視窗不可拖動/移動”的問題。
因此,另一種方法是真正解凍 Inno Setup GUI,同時執行長時間執行的程序:“長時間執行的程序”通過
ShellExecuteEx(). 然後安裝程序使用一個帶有條件的while循環WaitForSingleObject和一個非常小的超時來執行AppProcessMessage。
AppProcessMessage本身就是一個輔助函式。它使用“通用”程式碼重新創建Application.ProcessMessages-ish 過程,使用 WinAPI函式PeekMessage()和. 它的工作是成為 Inno Setup GUI 的消息泵。TranslateMessage()``DispatchMessage()這個技巧使視窗再次響應/可拖動,而“長時間執行的程序”在後台處理。
這是執行循環的來源:
if ShellExecuteEx(ExecInfo) then begin while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT do begin AppProcessMessage; WizardForm.Refresh(); end; CloseHandle(ExecInfo.hProcess); end;以下 GIST包含用於在不阻塞 Inno Setup GUI 的情況下執行 7zip
unzip.iss的獨立 Unzip Helper 的程式碼,包括使用該功能的點點滴滴。AppProcessMessage在這種情況下,“解壓縮”只是一個範例,您可以將執行的應用程序替換為 .NET 安裝程序或任何其他長時間執行的任務。
儘管這可能很容易,但我不建議在 .Net 安裝程序執行時隱藏您的安裝程序。我見過其他安裝程序這樣做,當它發生時,我認為安裝已經完成,然後當我發現它真的沒有時我很困惑。(當安裝真的完成時,我也不能確定。也許它只是再次隱藏了自己。)
您可以在 Inno Setup 嚮導中顯示自定義頁面。讓這樣的頁面顯示進度條並保持其準確可能是一個挑戰,但至少您可以在嚮導頁面上顯示一條消息,說明您的安裝程序正在等待 .Net 安裝程序,然後再繼續。請參閱幫助文件的“使用自定義嚮導頁面”部分。