1

Тема: AHK: Оповещение об окончании копирования файлов

Для того, кто часто сталкивается с необходимостью копирования большого объема файлов, очевидно, насколько удобно было бы слышать оповещение в виде проигрывания системного звука или другого аудиофайла на выбор тогда, когда процесс копирования/перемещения файлов приходит к завершению.

Самый простой вариант, проиграть аудиофайл после закрытия окна копирования, но хотелось бы, чтобы этот параметр срабатывал лишь тогда, когда копирование/перемещение длится, например, уже более, чем 60 сек., чтобы избежать этой опции при копировании одной фотографии. Помимо проводника, также хотелось бы задействовать и фоновый режим копирования в Total Commander. Надеюсь, кто-то из разработчиков найдет время, чтобы воплотить эту мысль в реальность.

2

Re: AHK: Оповещение об окончании копирования файлов

Что то типо этого?

#Persistent
#NoEnv
Acc_ObjectFromWindow(hWnd, idObject = 0)
{
    If    DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
    Return    ComObjEnwrap(9,pacc,1)
}

Acc_Error(p="") {
    static setting:=0
    return p=""?setting:setting:=p
}
Acc_Children(Acc) {
    if ComObjType(Acc,"Name") != "IAccessible"
        ErrorLevel := "Invalid IAccessible Object"
    else {
         cChildren:=Acc.accChildCount, Children:=[]
        if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 {
            Loop %cChildren%
                i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):
            return Children.MaxIndex()?Children:
        } else
            ErrorLevel := "AccessibleChildren DllCall Failed"
    }
    if Acc_Error()
        throw Exception(ErrorLevel,-1)
}

Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
    try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}

Acc_GetChild(Acc, path="") {
    Loop Parse, path, csv
        Acc := Acc_Children(Acc)[A_LoopField]
    return Acc
}


DllCall("LoadLibrary","Str","oleacc","Ptr")
loop
{
WinWait ahk_class OperationStatusWindow
for i,k in Acc_Children(Acc_GetChild(Acc_ObjectFromWindow(WinExist("ahk_class OperationStatusWindow")),"4,1,4"))
    if (k.AccRole(0) = 20) and (k.AccName(0) ~= " 100%$")
        traytip,инфа, % k.AccName(0)
sleep 100
}

на win 7 вроде как Не должно работать это, потому что там не группируются окна копирования.

3 (изменено: Malcev, 2015-09-06 20:42:52)

Re: AHK: Оповещение об окончании копирования файлов

Думаю, надо копать эти темы:
http://forum.script-coding.com/viewtopic.php?id=6231
http://forum.script-coding.com/viewtopic.php?id=6502

4 (изменено: becauseim, 2016-12-21 16:31:24)

Re: AHK: Оповещение об окончании копирования файлов

На примере от KusochekDobra создал простой сценарий, оповещающий об окончании копирования. Помогите, пожалуйста, добавить условие, при котором оповещение работало только при копировании дольше минуты.


SetTimer, WaitCopying, 100

WaitCopying:
winName:="ahk_class OperationStatusWindow"
while !(WinExist(winName))
	StartTime := A_TickCount
	Sleep, 250
WinWaitClose, %winName%
ElapsedTime := A_TickCount - StartTime
if (ElapsedTime > 60000)
{
	MsgBox, Copying is Finished!
}
return

upd.: вроде все получилось. Но хотелось бы в отдельное окно добавить оповещение со временем, за которое было совершено копирование. Можно вынести в окно ElapsedTime , но хотелось бы иметь результат в привычном формате, т.е. необходимо преобразовать миллиcекунды в формат HH:MM:SS. Как это сделать?

5

Re: AHK: Оповещение об окончании копирования файлов

Подскажите, пожалуйста, почему таймер перестает работать после добавления следом еще одного таймера? Как это исправить?

#SingleInstance Force
SetTitleMatchMode, 2

SetTimer, WaitCopying, 100
;~ SetTimer, WaitRender, 100

WaitCopying:
winName:="complete ahk_class OperationStatusWindow"
while !(WinExist(winName))
	Sleep, 250
	StartTime := A_TickCount
WinWaitClose, %winName%
ElapsedTime := A_TickCount - StartTime
if (ElapsedTime > 1000) { ; 1 sec
	ElapsedTimeConvert := SecToHHMMSS(ElapsedTime // 1000)
	SoundPlay, D:\Soft\AHK\Sounds\sound_chek.mp3
	MsgBox, , File System, Copying is Finished!`nElapsed time: %ElapsedTimeConvert%
}
return

WaitRender:
winName:="Encoding"
while !(WinExist(winName))
	Sleep, 250
	StartTime := A_TickCount
WinWaitClose, %winName% ahk_class Premiere Pro
ElapsedTime := A_TickCount - StartTime
if (ElapsedTime > 120000) { ; 2 min
	ElapsedTimeConvert := SecToHHMMSS(ElapsedTime // 1000)
	MsgBox, , Premiere Pro, Render Complete!`n`n%ElapsedTimeConvert%`n%ElapsedTimeConvert2%
}
return

SecToHHMMSS(Sec){
	OldFormat := A_FormatFloat
	SetFormat, Float, 02.0
	Hrs  := Sec//3600/1
	Min := Mod(Sec//60, 60)/1
	Sec := Mod(Sec,60)/1
	SetFormat, Float, %OldFormat%
	Return (Hrs ? Hrs ":" : "") Min ":" Sec
}

6

Re: AHK: Оповещение об окончании копирования файлов

Таймер вызывается каждые 100 мс, а внутри цикл с sleep 250, который нафиг не нужен.
Переписать без циклов.