Hallo Gemeinde,
eine neue Frage die mich schon länger beschäftigt:
Ich benutze zum Kopieren die o.g. Funktion. Das Problem damit ist, dass wenn das angezeigte Progressbarfenster (durch ProgressOn erzeugt) verschoben wird,
wird die Aktualisierung der Progressbar unterbrochen und es gibt im Titel des Fenster die Meldung "Not Responding"
Das ist mein Test-Code:
#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <APIFilesConstants.au3>
#include <Misc.au3>
#include <WinAPIError.au3>
#include <WinAPIFiles.au3>
Opt('TrayAutoPause', 0)
; Beispiel: Label des USB-Sticks
Global $desiredLabel = "Backup" ; Hier das gewünschte Label einfügen
Global $sSource = "C:\Test.zip"
CheckUSBStick($desiredLabel)
Func CheckUSBStick($label)
Local $hProgressProc = DllCallbackRegister('_ProgressProc', 'bool', 'uint64;uint64;uint64;uint64;dword;dword;handle;handle;ptr')
Local $a_driveList = DriveGetDrive("REMOVABLE")
If @error Then
MsgBox(16, "Error", "No removable drives found!" & @crlf & @crlf & "Please connect BackupStick")
Return
EndIf
Local $found = False
For $i = 1 To $a_driveList[0]
Local $driveLabel = DriveGetLabel($a_driveList[$i] & "\")
If $driveLabel = $label Then
$sPath = $a_driveList[$i]
$sDestiUsb = $sPath & "\test.zip"
$found = True
ExitLoop
EndIf
Next
If Not $found Then
While True
MsgBox(48, "USB-Stick nicht erkannt", "Bitte schließen Sie den USB-Stick mit dem Label 'Backup' an.")
; Überprüfen, ob ein USB-Stick mit dem Label "Backup" angeschlossen ist
$a_driveList = DriveGetDrive("REMOVABLE")
For $i = 1 To $a_driveList[0]
$driveLabel = DriveGetLabel($a_driveList[$i] & "\")
If $driveLabel = $label Then
$s_Path = $a_driveList[$i]
$sDestiUsb = $sPath & "\Test.zip"
$found = True
ExitLoop ; Die Schleife beenden, wenn der Stick gefunden wurde
EndIf
Next
If $found Then
ExitLoop
EndIf
Sleep(300) ; 300ms warten, bevor erneut überprüft wird
WEnd
EndIf
ProgressOn('Kopieren', 'Copying...', '0%')
If Not _WinAPI_CopyFileEx($sSource, $sDestiUsb, 0, DllCallbackGetPtr($hProgressProc)) Then
_WinAPI_ShowLastError('Error copying ' & $sSource)
EndIf
DllCallbackFree($hProgressProc)
ProgressOff()
Return
EndFunc
Func _ProgressProc($iTotalFileSize, $iTotalBytesTransferred, $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData)
#forceref $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData
Local $iPercent = Round($iTotalBytesTransferred / $iTotalFileSize * 100)
If $iPercent = 100 Then
ProgressSet($iPercent, '', 'Fertig')
Else
ProgressSet($iPercent, $iPercent & '%')
EndIf
Sleep(10) ; Kopierprozess verlangsamen, um die Progressbar zu sehen
If _IsPressed('1B') Then ; 1B = ESC-Taste
Return $PROGRESS_CANCEL
Else
Return $PROGRESS_CONTINUE
EndIf
EndFunc ;==>_ProgressProc
Alles anzeigen
Das seltsame daran: wenn ich den Code aus der Hilfe für _WinAPI_CopyFileEx ausführe, ist das Progressbar-Fenster blockiert, kann nicht verschoben werden und
die Progressbar wird bis zum Ende aktualisiert. In meinem Code, der in Bezug auf alle Bestandteile der Aufrufe und der Func Progressproc identisch sein sollte, da CopyPaste,
hält die Blockade nur bis > 5 % an, dann kommt es beim Verschieben des Fensters zu o.g. Fehlverhalten.
Hat jemand bitte eine Erklärung dafür
p.s.: dass das Kopieren auch anders, z.b. mit UDf gemacht werden kann, ist mir bewusst!
Ich möchte bitte nur die Erklärung für das Verhalten, wenn möglich und keine
Vorschläge/Diskussionen wie das Kopieren anderweitig bewerkstelligt werden kann.