Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


А что мешает использовать _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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:23, 24-07-2009 | #42