本帖最后由 令狐大虾 于 2025-4-22 23:27 编辑
例如:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1) ; 启用事件驱动模式:ml-citation{ref="4,7" data="citationList"}
; 创建主窗口
Global $hGUI = GUICreate("WIM解压进度", 400, 150)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
; 进度条控件
Global $iProgress = GUICtrlCreateProgress(20, 40, 360, 30)
Global $lblStatus = GUICtrlCreateLabel("准备解压...", 20, 90, 360, 20)
GUISetState(@SW_SHOW, $hGUI)
; 解压参数配置
Global $sWimFile = "C:\install.wim" ; 修改为实际路径
Global $sDestDir = "D:\Extracted" ; 修改为目标目录
Global $sWimlibExe = "wimlib-imagex.exe"
; 启动解压进程
Global $iPID = Run($sWimlibExe & ' extract "' & $sWimFile & '" 1 "' & $sDestDir & '" --progress', @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
If @error Then
GUICtrlSetData($lblStatus, "错误:无法启动进程")
Exit
EndIf
; 实时更新进度
AdlibRegister("_UpdateProgress", 250)
Func _UpdateProgress()
Local $sOutput = StdoutRead($iPID)
If @error Then
AdlibUnRegister("_UpdateProgress")
Return
EndIf
; 匹配进度数值
Local $aMatches = StringRegExp($sOutput, 'Progress:\s+(\d+)%', 3)
If Not @error Then
Local $iPercent = Number($aMatches[0])
GUICtrlSetData($iProgress, $iPercent)
GUICtrlSetData($lblStatus, "解压进度:" & $iPercent & "%")
EndIf
EndFunc
; 等待进程结束
While ProcessExists($iPID)
Sleep(100)
WEnd
; 处理结果
If @exitcode = 0 Then
GUICtrlSetData($lblStatus, "解压完成")
Else
GUICtrlSetData($lblStatus, "错误代码:" & @exitcode)
EndIf
Sleep(3000)
GUIDelete($hGUI)
Func _Exit()
Exit
EndFunc
|