А что мешает использовать _IsPressed? Оно нормально проверяется и срабатывает.
Код:
#include <Misc.au3>
Global Const $PROGRESS_CONTINUE = 0
Global Const $PROGRESS_CANCEL = 1
Global Const $PROGRESS_STOP = 2
Global Const $PROGRESS_QUIET = 3
Global $hDll = DllOpen("User32.dll")
_FileCopyEx("E:\Downloads\Video.avi", "D:\Dest\Video.avi", 8+1)
Func _FileCopyEx($sSource, $sDest, $iFlags=0)
If Not FileExists($sSource) Then Return SetError(1)
ProgressOn("_FileCopyEx() Demo", "Копирование файла...")
Local $sFileName = StringRegExpReplace($sSource, "^.*\\", "")
Local $sFilePath = StringRegExpReplace($sDest, "\\[^\\]*$", "")
If Not BitAND($iFlags, 1) And FileExists($sDest) Then
ProgressSet(0, "Ошибка копирования файла (" & $sFileName & "):" & @CRLF & "* Перезапись файла не разрешена")
Sleep(2000)
ProgressOff()
Return SetError(2)
EndIf
If (BitAND($iFlags, 8) And Not DirCreate($sFilePath)) Or (Not StringInStr(FileGetAttrib($sFilePath), "D")) Then
ProgressSet(0, "Ошибка копирования файла (" & $sFileName & ")" & @CRLF & "* Не найдена папка назначения")
Sleep(2000)
ProgressOff()
Return SetError(3)
EndIf
Local $hCopyProgressRoutine = DllCallbackRegister("_CopyProgressRoutine", "int", _
"uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;str")
Local $aRet = DllCall("Kernel32.dll", "int", "CopyFileExA", _
"str", $sSource, _
"str", $sDest, _
"ptr", DllCallbackGetPtr($hCopyProgressRoutine), _
"str", $sFileName, _
"int", 0, _
"int", 0)
DllCallBackFree($hCopyProgressRoutine)
Sleep(1000)
ProgressOff()
Return 1
EndFunc
Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
Local $iPrecent = $TotalBytesTransferred/$TotalFileSize * 100
ProgressSet($iPrecent, "Проценты: " & Round($iPrecent, 1) & " %", "Копирую: " & $lpData)
;Abort on "Ctrl + Shift + A"
If _IsPressed("10", $hDll) And _IsPressed("11", $hDll) And _IsPressed("41", $hDll) Then
ProgressSet($iPrecent, "Проценты: " & Round($iPrecent, 1) & " % (Прервано пользователем)")
Sleep(1000)
Return ProcessClose(@AutoItPID)
;Return $PROGRESS_CANCEL
EndIf
Return $PROGRESS_CONTINUE
EndFunc