Gimmick: Restzeitanzeige für modale Vorgänge

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Gimmick: Restzeitanzeige für modale Vorgänge

Post by *van Dusen »

Hallo,

im deutschen Forum habe ich keinen geeigneten Thread gefunden, um die folgende Spielerei (mehr ist es nicht) unterzubringen:

Es handelt sich um ein AutoIT-Script, welches die verstrichene Zeit, die geschätzte Restdauer und die geschätzte Gesamtdauer eines Vorgangs im Fenstertitel eines modalen TC-Dialogs mit Fortschrittsbalken anzeigt. Dieser Dialog wird z.B. bei Vorgängen wie Packen, Entpacken, Kopieren und Löschen, die im Vordergrund laufen, gezeigt.

Hier ein Screenshot, wie das dann aussieht.

Ein ReadMe, das Script (einmal mit Kommentaren und einmal ohne) und eine allein lauffähige kompilierte Version des Scripts könnt Ihr hier herunterladen.

Hier das Script in der unkommentierten Fassung (ist auch im o.g. ZIP enthalten):

Code: Select all

;====================================================================================================
;TCRestzeit V0.9.1, van Dusen, 2006-03-05 (van_dusen@email.de)
;Script für AutoIT3 V3.1.1.0 (http://www.autoitscript.com/autoit3/)
;Beschreibung: Addon für den Dateimanager TotalCommander (http://www.ghisler.com)
;Zeigt im Titel des Fensters der TC-Fortschrittsanzeige die verstrichene Zeit, Restdauer und Gesamtdauer
;eines Vorgangs (Packen, Entpacken, Kopieren, Löschen usw.)  an.
;Script getestet mit mit TC V6.54a, WinXP HE SP1
;====================================================================================================

#include <GUIConstants.au3>

AutoItSetOption("WinTitleMatchMode", 4)
AutoItSetOption("GUIOnEventMode", 1)
AutoItSetOption("PixelCoordMode", 2)

;~ $frm_gui = GUICreate("", 400, 90, -1, -1, -1, $WS_EX_TOPMOST)
$frm_gui = GUICreate("", 400, 90)
$lbl_status = GUICtrlCreateLabel("", 10, 20, 380, 20, $SS_SUNKEN+$SS_CENTER)
$btn_cancel = GUICtrlCreateButton ("Beenden", 150, 50, 100, 30)

GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUICtrlSetOnEvent($btn_cancel, "_Exit")
GUISetState(@SW_SHOW)

Global $wh_tcprogress
Global $wt_tcprogress

While 1
	
	WinSetTitle($frm_gui, "", "TCRestzeit 0.9 (Ruht)")
	GUICtrlSetData($lbl_status, "Warte auf einen Vorgang mit TC-Fortschrittsdialog")
	
	WinWait("classname=TDLG2FILEACTIONMIN")
	$wh_tcprogress = WinGetHandle("classname=TDLG2FILEACTIONMIN")
	$wt_tcprogress = WinGetTitle($wh_tcprogress)
	
	$wh_activewin = WinGetHandle(WinGetTitle(""))
	
	$pos_tcprogressbar = ControlGetPos($wh_tcprogress, "", "TPercentPanel2")
	$err_tcprogressbar = 0
	If @error Or Not ControlCommand($wh_tcprogress, "", "TPercentPanel2", "IsVisible", "") Then
		$err_tcprogressbar = 1
		$pos_tcprogressbar = ControlGetPos($wh_tcprogress, "", "TPercentPanel1")
		If @error Or Not ControlCommand($wh_tcprogress, "", "TPercentPanel1", "IsVisible", "") Then
			WinWaitClose($wh_tcprogress)
		Else
			$err_tcprogressbar = 0
		EndIf
	EndIf

	If Not $err_tcprogressbar Then
		$l = $pos_tcprogressbar[0]
		$t = $pos_tcprogressbar[1] + $pos_tcprogressbar[3] - 2
		$r = $pos_tcprogressbar[2] + $l
		WinActivate($wh_tcprogress)
		$px_poscurr = PixelSearch($l, $t, $r, $t, 0xFFFFFF)
		WinActivate($wh_activewin)
		$px_posinit = $px_poscurr[0] - 1 - $pos_tcprogressbar[0]
	EndIf
	
	$ts_init = TimerInit()
	$ts_diff = 0
	$ts_diffprev = 0
	$px_diff = 0
	$tm_remain = 0
	$tm_total = 0
	;$stichprobe = 0
	
	While WinExists($wh_tcprogress)
		
		$ts_diffprev = $ts_diff
		$ts_diff = TimerDiff($ts_init)
		$info_tmelapsed = _Milliseconds2Time($ts_diff)
		
		If WinActive($wh_tcprogress) Then
			;$stichprobe = $stichprobe + 1
			$px_poscurr = PixelSearch($l, $t, $r, $t, 0xFFFFFF)
			$px_elapsed = $px_poscurr[0] - 1 - $pos_tcprogressbar[0]
			$px_remain = $pos_tcprogressbar[2] - $px_elapsed
			
			$px_diffprev = $px_diff
			$px_diff = $px_elapsed - $px_posinit
			If $px_diffprev = $px_diff Then
				$tm_remain = $tm_remain - ($ts_diff - $ts_diffprev)
			Else
				$tm_remain = $ts_diff *  $px_remain / $px_diff
			EndIf
			$tm_total =  $ts_diff + $tm_remain
			
			If $tm_remain > 0 Then
				$info_tmremain = _Milliseconds2Time($tm_remain)
				$info_tmtotal = _Milliseconds2Time($tm_total)
			Else
				$info_tmremain = "??:??:??"
				$info_tmtotal = "??:??:??"
			EndIf
			
			$info = "Bisher " & $info_tmelapsed & " • Rest " & $info_tmremain & " • Gesamt " & $info_tmtotal
			
			GUICtrlSetData($lbl_status, Round($px_elapsed / $pos_tcprogressbar[2] * 100, 0) & "% • " & $info)
			WinSetTitle($wh_tcprogress, "", $info)
			WinSetTitle($frm_gui, "", "Rest " & $info_tmremain)
			
		Else
			WinSetTitle($frm_gui, "", "Bisher " & $info_tmelapsed)
			GUICtrlSetData($lbl_status, "Bisher " & $info_tmelapsed)
			
		EndIf
		
		Sleep(1000)
		
	WEnd
WEnd

Func _Exit()
	GUIDelete($frm_gui)
	If WinExists($wh_tcprogress) Then WinSetTitle($wh_tcprogress, "", $wt_tcprogress)
	Exit(0)
EndFunc

Func _Milliseconds2Time($ms)
	$hh = Int($ms / (1000 * 60 * 60))
	$ms = $ms - $hh * (1000 * 60 * 60)
	$mm = Int($ms / (1000 * 60))
	$ms = $ms - $mm * (1000 * 60)
	$ss = Int($ms / 1000)
	Return StringFormat("%02d", $hh) & ":" & StringFormat("%02d", $mm) & ":" & StringFormat("%02d", $ss)
EndFunc
Viel Spaß damit! :)

EDIT
Update auf V0.9.1 (o.g. Script und ZIP):
Fehlerabbruch bei Fortschrittsdialog für externen Packeraufruf beseitigt

EDIT 20.03.06
Update auf V0.9.5:
Seit V0.9.1 diverse Änderungen und Erweiterungen (siehe ReadMe)
Neu in V0.9.5 gegenüber V0.9.4:
Dialogfunktion zum Editieren des Archivdateinamens im TC-Dialog "Dateien packen" mit Platzhaltern ("[G]", "[P]", "[Y]", "[M]" usw.)
Abbildung des Dialogs TCRestzeit V0.9.5
Download TCRestzeit_0.9.5.zip (246.469 Bytes)
Last edited by van Dusen on 2006-03-20, 20:52 UTC, edited 1 time in total.
User avatar
Hacker
Moderator
Moderator
Posts: 13141
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

Eine exzellente Idee, die aber leider anscheinend wenig Anklang findet. :(

Ich habe mir erlaubt eine AHK Alternative zu programmieren, zu finden unter Show elapsed / remaining / total / start / finish times in title bar of progress dialogs im Wiki.

Ich schlage vor du machst dein Skript auch uber die Wiki zuganglich.

Danke fur die Inspiration.

Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
icfu
Power Member
Power Member
Posts: 6052
Joined: 2003-09-10, 18:33 UTC

Post by *icfu »

@Hacker:
Eine exzellente Idee, die aber leider anscheinend wenig Anklang findet.
Die Idee finde ich toll, allerdings bekomme ich langsam den Eindruck, daß nicht ghisler den TC weiterentwickelt, sondern die Skriptschreiber. ;)
Man kann nur hoffen, daß ghisler solche Skripts auch als Anreiz versteht, etwas progressiver zu entwickeln und die Ideen in seine Arbeit einfließen.

Danke für das Skript, es wird in meine permanent laufende Scriptsammlung assimiliert. Allerdings muß ich mir für WindowBlinds irgendwas anderes bauen, denn das übermalt die Titelleiste leider. ;)

@van Dusen:
Vielen Dank für die Ausarbeitung der Idee. Schade aber, daß Du bei AutoIt "gelandet" bist und nicht bei AHK, denn ansonsten hättest Du keinen Grund gehabt, Dein Script als "Spielerei" zu bezeichnen. ;)
Der exzellente Hotkeysupport (u.a. durch Keyboardhook) von AHK ist genau der Grund, warum ich von AutoIt abgerückt bin, obwohl dessen Syntax und insbesondere der angepaßte SciTE-Editor eine große Verlockung sind.

Icfu
This account is for sale
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Post by *van Dusen »

Hallo Hacker und Icfu,

vielen Dank für Euer nettes Feedback :)

AutoIT ist für mich auf Grund der Syntax zugänglicher als AHK. Zumindest was den ersten Eindruck angeht, wenn ich mir die AHK-Scripte im Wiki so anschaue. Mit AHK habe ich mich allerdings noch immer nicht näher beschäftigt, aber das Tool und alle Scripte aus dem Wiki warten auf meiner lokalen Platte schon, dass diesem Mangel abgeholfen wird ;)

AHK steht ja im Ruf, recht stabil zu laufen. AutoIT liefert mir öfter mal unerwartete Ergebnisse, vor allem beim Handling von Fenstern, die in rascher Folge erzeugt und geschlossen werden, beim Zugriff auf deren Steuerelemente, bei Fokuswechseln usw. Deshalb bin ich natürlich neugierig, ob diese Problemchen an meinem Ungeschick liegen oder ob vielleicht AutoIT mir da öfter einen Strich durch die Rechnung macht.

Die HotKey-Funktionen von AutoIT habe ich bisher bewusst noch nicht eingesetzt; aber interessant, dass hier wohl signifikante Unterschiede zwischen AutoIT und AHK bestehen... muss ich mir auch mal anschauen.


Neue Version TCRestzeit V0.9.3

Das AutoIT-Script "TCRestzeit" habe ich heute runderneuert und eine Version 0.9.3 hochgeladen. Neu ist vor allem, dass es nun zwei weitere Anzeigemodi gibt:

* Fortschritt in Bytes: Bisher, Rest, Gesamt
Die Einheit wird automatisch gewählt (bkMGT)
* Kombi aus Restzeit und Datendurchsatz:
Bytes bisher (bkMGT), Datendurchsatz (bkMGT)/s, Restzeit

Das ist der für mich staunenswerten Tatsache zu verdanken, dass der TC auf das Kommando "cm_GetFileSpace" auch antwortet, während bereits ein modales Fortschrittsfenster aktiv ist. D.h. also, dass cm_GetFileSpace aufgerufen und ausgewertet wird, sobald ein Fortschrittsdialog aktiv wird.


Hier zwei Abbildungen von der V0.9.3:
TCRestzeit 0.9.3 Dialogfenster
Fenstertitel des TC-Fortschrittsdialogs

Und hier das ZIP-File, welches das Script in kommentierter und in unkommentierter Form, eine allein lauffähige kompilierte Version des Scripts, ein Readme und die beiden o.g. Abbildungen enthält:
TCRestzeit_0.9.3.zip


EDIT 13.03.2006

Neue Version TCRestzeit V0.9.4

Beseitigt vor allem (hoffentlich) einen üblen Fehler beim Schließen des TC-Dialogs "Speicherbedarf ermitteln..."

Außerdem neue Optionen "Standard"- und "Erweiterter" Funktionsumfang. Bei Einstellung "Standard" erfolgt keine automatische Ermittlung der Dateigröße (das kann m.E. nämlich etwas nervig sein, wenn sich bei nahezu jeder Aktion das Fenster "Totaler Platzbedarf" mit einem "Pling" meldet, kurz aufblinkt und gleich darauf wieder verschwindet)

Weiteres siehe ReadMe.

Und hier das ZIP-File, welches das Script in kommentierter und in unkommentierter Form, eine allein lauffähige kompilierte Version des Scripts, ein Readme und drei Abbildungen enthält:
TCRestzeit_0.9.4.zip (232580 Bytes)
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

TCRestzeit V0.9.8

Post by *van Dusen »

Neue Version 0.9.8

Download: http://rapidshare.com/files/68148895/TCRestzeit_0.9.8.zip.html

Das Archiv <TCRestzeit_0.9.8.zip> (296.902 Bytes) enthält die Dateien
* TCRestzeit.au3
* TCRestzeit.exe
* TCRestzeit.lng
* TCRestzeit_ReadMe_DE.txt

Hinweis: Die Screenshots habe ich noch nicht auf die V0.9.8 aktualisiert.

V0.9.8 vom 07.11.2007
  • Geändert: Wenn Fortschrittbalken neuen Stils verwendet werden, dann wird der
    Verarbeitungsfortschritt im TC-Fortschrittsdialog nicht grafisch ermittelt.
    Stattdessen wird der Wert (Fortschritt in Prozent) direkt aus dem ProgressBar-
    Steuerelement ausgelesen.
    Vorteil: Auch wenn der TC-Fortschrittsdialog inaktiv ist, kann der Prozentwert
    des TC-Fortschrittsbalkens ausgelesen werden und es können alle Infos in den
    Anzeigen von TCRestzeit korrekt aktualisiert werden.
V0.9.7 vom 05.11.2007
  • Geändert: Unterstützung für alle ProgressBar-Stile, die im TC im Schlüssel
    "NewStyleProgress" des Abschnitts "[Configuration]" der <wincmd.ini>
    konfigurierbar sind.
  • Hinzugefügt: Sprachunterstützung (TCRestzeit.lng)
  • Hinzugefügt: Kompaktdialog (Nur-Anzeige-Dialog)
  • Geändert: Ermittlung des Speicherbedarfs markierter Dateien erfolgt jetzt im
    Script selbst (ohne Aufruf des TC-Kommandos cm_GetFileSpace)
  • Hinzugefügt: Alle Anzeigeschemata sind benutzerdefinierbar
User avatar
ate
Senior Member
Senior Member
Posts: 274
Joined: 2003-12-17, 22:48 UTC

Post by *ate »

Hallo !

Zunächst einmal vielen Dank an van Dusen. Interessantes Tool, das ich nach einem ersten Test in der Anfangsphase aus den Augen verloren und nun wiederentdeckt habe.

Trotzdem mal ein paar Verständnisfragen :

Wenn ich die TCRestzeit.exe starte, habe ich immer einen Eintrag in der Taskleiste - minimieren nur in den Tray klappt nicht. Habe ich da was übersehen ?

Wenn ich eine Kopieraktion anstarte, werden die gewünschten Daten im Fenstertitel angezeigt. Wenn ich dann allerdings auf "Hintergrund" klicke, setzt die Restzeitanzeige aus und startet auch nicht wieder, wenn ich dieses Hintergrundkopierfenster wieder in den Vordergrund hole.

Funktioniert die Anzeige deshalb beim Packen/Entpacken bei mir nicht, weil ich in der wincmd.ini die AlwaysPackInBackground=2 und AlwaysUnpackInBackground=2 Einträge gesetzt habe ?
Post Reply