; Press Esc to terminate script, Pause to pause/resume process
; Alt+A - запуск процесса (который и будем тормозить)
Global $iPIDProc
Global $Pause = 0
Global $sToggleFunc
$sToggleFunc = "ArcProcess_TogglePause"
HotKeySet("{PAUSE}", $sToggleFunc)
HotKeySet("{ESC}", "Terminate")
Global $sProcCreateFunc
$sProcCreateFunc = "ArcProcess_Create"
HotKeySet("!a", $sProcCreateFunc) ; Alt+A - Горячая клавиша запуска процесса создания архива (который и будем тормозить)
HotKeySet("!ф", $sProcCreateFunc)
AdlibRegister("Callback")
While 1
Sleep(100)
WEnd
Func ArcProcess_Create()
Local $Arc = @ScriptDir & '\Test.7z'
Local $ArcCmd = '"' & @ProgramFilesDir & '\7-Zip\7z.exe" a "' & $Arc & '" -t7z -m0=BCJ -m1=LZMA:d=26 -mx=9 -mhc=on -ms=on -mmt=on "' & @WindowsDir & '\Help\*"'
;$ArcCmd = '"' & @COMSPEC & '" /C "@echo off && @title CMD - Create archive && @echo. && ' & $ArcCmd & ' && @echo. && @echo Pause 5 sec ... && @ping -n 5 localhost > nul && @echo. "'
If FileExists ($Arc) Then FileDelete ($Arc)
$iPIDProc = Run($ArcCmd, '', @SW_SHOW)
ConsoleWrite(@CRLF & "+> " & @ScriptLineNumber & " " & $sProcCreateFunc & "() +> Run process: PIDProc = " & $iPIDProc & "; Error - " & @error & @CRLF & "+> cmd - " & $ArcCmd & @CRLF)
EndFunc
Func ArcProcess_TogglePause()
Local $ret
If $Pause = 0 Then
ConsoleWrite(@CRLF & "+> " & @ScriptLineNumber & " " & $sToggleFunc & "() -> _WinAPI_SuspendProcess() ")
$ret = _WinAPI_SuspendProcess($iPIDProc, True)
If $ret = 1 Then
ToolTip('Process is "Paused"', 0, 0)
$Pause = 1
EndIf
Else
ConsoleWrite(@CRLF & "+> " & @ScriptLineNumber & " " & $sToggleFunc & "() -> _WinAPI_SuspendProcess() ")
_WinAPI_SuspendProcess($iPIDProc, False)
ToolTip("")
$Pause = 0
EndIf
EndFunc
Func Terminate()
ConsoleWrite(@CRLF & "+> " & @ScriptLineNumber & " Terminate()" & @CRLF)
Exit 0
EndFunc
Func Callback()
If $Pause = 0 Then ConsoleWrite(".")
EndFunc
Func _WinAPI_SuspendProcess($iPID, $bSuspend = True)
$iPID = ProcessExists($iPID)
If Not $iPID Then
ConsoleWrite(@CRLF & "!> " & @ScriptLineNumber & " _WinAPI_SuspendProcess(" & $iPID & ", " & $bSuspend & ") -> WARNING: Process " & $iPID & " not exist" & @CRLF)
Return SetError(1, 0, 0)
EndIf
Local $aNtSuspResumProc
Local $ah_OpProcess = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', 0, 'int', $iPID)
If $bSuspend Then
$aNtSuspResumProc = DllCall("ntdll.dll", "int", "NtSuspendProcess", "int", $ah_OpProcess[0])
Else
$aNtSuspResumProc = DllCall("ntdll.dll", "int", "NtResumeProcess", "int", $ah_OpProcess[0])
EndIf
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ah_OpProcess)
If IsArray($aNtSuspResumProc) Then
ConsoleWrite(@CRLF & "-> " & @ScriptLineNumber & " _WinAPI_SuspendProcess(" & $iPID & ", " & $bSuspend & ") -> Process is " & StringLeft("'Paused' ", 30*($bSuspend=True)) & StringLeft("'Resumed'" & @CRLF, 30*($bSuspend=False)))
Return 1
EndIf
ConsoleWrite(@CRLF & "!> " & @ScriptLineNumber & " _WinAPI_SuspendProcess(" & $iPID & ", " & $bSuspend & ") - ERROR ")
Return SetError(2, 0, 0)
EndFunc