Freistellen erleichtern bei IrfanView

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Freistellen erleichtern bei IrfanView

03 Feb 2020, 12:33

Hallo liebes Forum!

Da ich viele Bilder (Scans) bearbeite, die ich öfters beschneiden (freistellen) muß, möchte ich mir diese Funktion etwas erleichtern. Ich arbeite mit IrfanView, dort sieht das manuell folgendermaßen aus:
1. Bild öffnen und Rahmen ziehen um den Bereich, den man freistellen will.
2. Im Menü "Bearbeiten" auf "Freistellen" clicken oder das Kürzel Strg+Y verwenden.
3. Im Menü "Datei" auf "Speichern (Original-Verzeichnis) clicken oder das Kürzel Strg+S verwenden.
4. Jetzt öffnet sich der Ursprungsordner zum Abspeichern, bestätigen mit Enter.
5. Aber jetzt fragt der IrfanView nochmals in einem weiteren Fenster nach, ob man die alte Datei überschreiben will. Dabei ist standarnmäßig der Nein-Button aktiviert. Man muß also entweder mit der Maus oder mit der Cursor-Taste nach links wandern, bevor man Enter drückt.
Ab dem 2. Schritt möchte ich diese Aktion zusammenfassen.
Wenn man das jetzt in AHK-Code umsetzt, sähe das so aus:

Code: Select all

F5::
   Send, ^Y
   Send, ^S
   Send, {Enter}
   Send, {Left}{Enter}
return
Nur klappt das so nicht. Im Script wird das Left als ein Rückwärtsbefahl im noch offenen Hauptfenster verstanden und zeigt das das vorhergehende Bild an. Wie erwische ich das richtige Fenster? Oder kann ich den Ja-Button hier auf eine andere Weise erreichen?

Viele Grüße von Meister Lampe
KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Freistellen erleichtern bei IrfanView

03 Feb 2020, 13:58

Versuch mal damit:

Code: Select all

F5::
   Send, ^y
   Send, ^s
   WinWaitActive, Speichern ...,, 3
   if (ErrorLevel)
   {
   MsgBox, Speichern.. erscheint nicht
   return
   }
   Send, {Enter}
   WinWait, IrfanView,, 3
   if (ErrorLevel)
   {
   MsgBox, Überschreiben erscheint nicht.
   return
   }
   Send, {Left}{Enter}
return
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Freistellen erleichtern bei IrfanView

03 Feb 2020, 16:46

Hallo KHA!

Vielen Dank für die schnelle Antwort. Ich habe Deinen Code ausprobiert, aber der funktioniert ebenfalls nicht.
Wie die Versionen, die ich vorher selber ausprobiert hatte, speichert er die datei gar nicht neu ab. das kann man auch aus der Angabe über den Zeitpunkt der letzten Änderung erkennen. Was aber auch merkwürdig ist: Der Name der Datei wird geändert. Mein Probebild hieß 'Image1.bmp', daraus hat das Script jetzt 'Imag_e1_.bmp' gemacht. Wieso wird der Name geändert, wenn ich ihm sage, daß er die Datei überschreiben soll? Es wird auch keine weitere Kopie erzeugt und abgespeichert, deretwegen man neue Namen vergeben müßte - zumindest nicht in demselben Ordner.

Nachtrag:
Mir scheint das auszusehen, als würde dieses Send, {Enter} einen Unterstrich in das Namensfeld zum Umbenennen vor dem Speichern senden, statt das Abspeichern unter gleichem Namen zu bestätigen. Und dann wird nicht die Änderung, sondern nur der andere Name abgespeichert.

Viele Grüße von Meister Lampe
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Freistellen erleichtern bei IrfanView

04 Feb 2020, 03:18

Hi Meister Lampe,
ich hab das auch mal ausprobiert und ebenfalls ein seltsames Verhalten festgestellt:
Zunächst funktionierten keine eigenen Hotkeys.

Nach verschiedensten Versuchen habe ich ein eigenes Testskript als Administrator ausgeführt und siehe da es funktionierte.

Und nun kommt das wirklich Seltsame:
Ab jetzt funktioniert das Skript auch, wenn es nicht als Administrator ausgeführt wird.
Ich habe dafür keine Erklärung.



Das hier funktioniert jetzt bei mir (Irfanview 4.54 64 Bit, deutsch, win10):

Code: Select all

F5:: Send, ^y^s!s+{tab}{enter}
Falls du "Original-Datum/Zeit behalten" willst, mußt du noch einmalig das Häkchen im "Speicher ..." Fenster setzen. Aber wahrscheinlich hast du das bereits gemacht.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Freistellen erleichtern bei IrfanView

04 Feb 2020, 17:27

Hallo haichen!

Du hast in Deinem Code anscheinend versucht, alle Befehle quasi zusammenzuschmelzen. Ich selbst war mir nicht so sicher, inwieweit man das machen kann/darf, insbesondere weil der ja in mehreren Fenstern abläuft.
Bei mir jedenfalls bleibt er wieder im zweiten Fenster - dem zum Abspeichern - stecken. Ich kann dann aber den Vorgang manuell abschließen.
Ich habe jetzt festgestellt, daß der dünne punktierte Rahmen, der das aktuell aktivierte Feld kennzeichnet, dabei durch einmal Tab nicht auf den Speichern-Button wandert, sondern auf das Feld zur Auswahl des Bildformats. Erst ein weiteres Tab führt dann auf Speichern.
Ich habe versucht, das im Code zu berücksichtigen, aber das spricht auch nicht an.

Code: Select all

F5:: 
	Send, ^y^s!s{Enter}
; hier kommt das Script nicht mehr weiter
	Send, {tab}{tab}{Enter}
	Send, {tab}{Enter}
return
Der Cursor bleibt im Eingabefeld für den Dateinamen stehen und markiert dabei den Namensvorschlag (der originale Name, der übernommen werden soll).
Ich habe jetzt verschiedene Befehle versucht und dazwischen gesetzt, um die Markierung aufzuheben oder/und den Cursor zu bewegen: weitere Tab, Enter oder End. Hat aber nichts gebracht.
Im Program wird also nur die erste Zeile abgearbeitet bzw. der Programmablauf springt nicht in das zweite Fenster hinein.
Mir ist schleierhaft, warum sich so eine einfache Befehlsfolge nicht umsetzen lassen soll.

Viele Grüße von Meister Lampe
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Freistellen erleichtern bei IrfanView

05 Feb 2020, 03:45

Hallo Meister Lampe,
bei mir läuft das so durch. Sollte auch kein Problem sein. Die neuen Fenster sind ja die aktiven Fenster, und in denen will man ja etwas tun.
Funktioniert bei mir auch mit SendInput, was eigentlich sogar die bessere Lösung sein müsste, da dann nichts anderes dazwischen funken kann.
Du hast meinen Sendbefehl auch etwas missverstanden:
^y beschneiden
^s speichern aufrufen
....Speichern-Fenster erscheint

!s ALT-S Speicherntaste drücken (das S in Speichern ist unterstrichen und deshalb mit der ALT Taste betätigbar)
....Überschreiben-Fenster erscheint

+{tab}{enter} Das + für SHIFT ist tatsächlich überflüssig.
Wenn es bei dir beim Speicherdialog hakt, funktioniert vielleicht:

Code: Select all

F5:: 
	Send, ^y^s                       ;beschneiden und Speicherdialog aufrufen
	Send, !s                         ;Speicherdialog bestätigen
	Send, {tab}{Enter}               ;überschreiben bestätigen
return
Ich würds dann auch noch mal mit SendInput ausprobieren.

Wenn das auch nicht klappt:

Code: Select all

F5:: 
	Send, ^y^s
	; mit Window Spy ermittelte "WinTitle"
	winwait, ahk_class #32770,,3
	;oder winwait, Speichern ...,,3
	Send, !s
	winwait, ahk_class #32770,,3
	;oder winwait, IrfanView,,3
	Send, {tab}{Enter}
return
Fällt mir gerade noch ein: Hast du das deutsche aktuelle IrfanView? Damit hab ich getestet (alles ausprobiert).
(Falls mal irgendwo ein l feht..liegt an meiner Tastatur)
garry
Posts: 3740
Joined: 22 Dec 2013, 12:50

Re: Freistellen erleichtern bei IrfanView

05 Feb 2020, 07:57

auch ein Beispiel , getestet mit Irfanview deutsch
EDIT : speichert in Ordner %a_desktop%\NEW

Code: Select all

;;-------- https://www.autohotkey.com/boards/viewtopic.php?p=312934#p312934 ---
;- Irfanviewx crop draw rectangle
;-------- saved at Sonntag, 15. Januar 2017 21:28:28 --------------
;-------- https://autohotkey.com/boards/viewtopic.php?f=5&t=26915 ---
;- open picture ( irfanview ) and draw rectangle to crop
setworkingdir,%a_scriptdir%
fd1=%a_desktop%\NEW
ifnotexist,%fd1%
  filecreatedir,%fd1%
return
!b::
Send, ^y
sleep,100
WinGetTitle, Title, A
stringreplace,title,title,- Irfanview,,all
SplitPath,title,name, dir, ext, name_no_ext, drive
Send,^s                 ;- opens dialog to save_as
sleep,100
send,%fd1%\%name_no_ext%    ;- save in new folder
sleep,100
send,!s                 ;- in german Speichern / or maybe also Save as ...
;sleep,100
;Send, {SPACE}          ;- show next picture
run,%fd1%                ;- open folder NEW 
return
;=====================================================================
Last edited by garry on 06 Feb 2020, 07:56, edited 3 times in total.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Freistellen erleichtern bei IrfanView

05 Feb 2020, 17:27

Hallo garry!

Vielen Dank für Deinen Code. Der kommt der Sache zumindest näher. Das ist endlich mal einer, der bis zum Ende durchläuft.
Allerdings steht die größte Schwierigkeit immer noch im Raum: Es soll ja keine neue Datei oder Kopie erzeugt werden, sondern das freigestellte oder zurechtgeschnittene Bild soll unter dem originalen Namen im originalen Ordner abgespeichert werden. Bei diesem Vorgang erscheint automatisch ein Fenster des Systems oder des Bildbearbeitungsprogramms und fragt, ob die Datei ersetzt/überschrieben werden soll. Und dieses gilt es anzusteuern und von dem standardmäßig aktivierten "Nein" auf "Ja" zu setzen und zu bestätigen. Wenn ich in Deinem Code von dem Befehl send,%name_no_ext%_NEW das NEW wegnehme und nur send,%name_no_ext% belasse, so ergibt sich wieder das besagte Problem und das Programm bricht ab.
Übrigens reicht es, wenn am Schluß der IrfanView geschlossen wird, statt das nächste Bild zu öffnen.

Viele Grüße von Meister Lampe
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Freistellen erleichtern bei IrfanView

06 Feb 2020, 03:54

Hallo Meister Lampe,
kannst du mein letztes Skript mal als Administrator ausführen (Rechtsklick>Als Administrator durchführen) ?
garry
Posts: 3740
Joined: 22 Dec 2013, 12:50

Re: Freistellen erleichtern bei IrfanView

06 Feb 2020, 07:58

kleine Aenderung oben : speichert im Ordner %a_desktop%\NEW mit gleichem Namen ( Original bleibt erhalten falls etwas schief geht )
User avatar
LuckyJoe
Posts: 335
Joined: 02 Oct 2013, 09:52

Re: Freistellen erleichtern bei IrfanView

06 Feb 2020, 13:48

Hi,

reicht es nicht, wenn du bei Irfan-View einfach in den Optionen - Einstellungen - Datei-Handling - Fragen beim Überschreiben bei "Speichern" und "Speichern als" den Haken raus nimmst?

HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Freistellen erleichtern bei IrfanView

06 Feb 2020, 17:29

Hallo Lucky!

Das war eine prima Idee. Sooo gut kannte ich den IrfanView nicht. Jetzt geht es natürlich viel schneller.

Code: Select all

F5:: 
	Send, ^y^s
    Send, {Esc}
return
Nur das mit dem Schließen hat einen Haken. Ich habe eine Möglichkeit zum Schließen des Scriptes eingebaut, ebenfalls auf der Escape-Taste basierend:

Code: Select all

Escape::
MsgBox, 33, AHK schließen, Wollen Sie das AHK-Tool wirklich schließen?
IfMsgBox Ok
   ExitApp
else
Return
Nun wird diese MsgBox vorrangig geöffnet. Ich hatte gedacht, wenn ich den Code in einen Rahmen mit #IfWinActive setze, dann würde sich das ändern - tut's aber nicht:

Code: Select all

GroupAdd, I_View, IrfanView
GroupAdd, I_View, i_view32.exe
GroupAdd, I_View, i_view64.exe
;...
#IfWinActive ahk_group I_View
Oder die Angaben in der Gruppendefinition genügen noch nicht bzw. sind falsch.

Viele Grüße von Meister Lampe
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Freistellen erleichtern bei IrfanView

07 Feb 2020, 03:01

Mit der Einstellung von Lucky Joe und dem Schließen von IrfanView sehen meine Skripte so aus:

Code: Select all

; Einstellung bei Irfanview:
; Optionen/Einstellungen/Datei-Handling : Speichern/Umbenennen 
; kein Haken bei Fragen beim Überschreiben bei 'Speichern' und 'Speichern als' ( Lucky Joe )

; getestet mit IrfanView 4.54 - 64 Bit - Deutsch
; AutoHotkey 1.1.32.00
; Windows 10 v1909 x64

; Bild in IrfanView laden und mit der Maus einen Rahmen ziehen
; F4 oder 5-Taste drücken
; Beide machen das gleiche:
; Das Bild wird beschnitten und unter demselben Namen gespeichert, dann wird IrfanView beendet

SetTitleMatchMode,2

F4:: 
	SendInput, ^y^s
	sleep, 1000
	SendInput, !s   
	WinClose, ahk_class IrfanView
	;ExitApp
return

F5:: 
	SendInput, ^y^s            ; beschneiden und Speicherdialog aufrufen
	winwait, Speichern ...,,3
	SendInput, !s 		       ; Speicherdialog bestätigen (ALT+S)
	winwait, IrfanView,,3
	WinClose, ahk_class IrfanView
	;ExitApp
return
@Meister Lampe: Ist getestet und funktioniert bei mir. Bin mal gespannt ob das bei dir oder jemand anderem funktioniert.
Ach gerade erst gesehen/gelesen, willst du das Skript, Irfanview oder beides schließen?
garry
Posts: 3740
Joined: 22 Dec 2013, 12:50

Re: Freistellen erleichtern bei IrfanView

07 Feb 2020, 03:32

ich musste noch 'j' senden ( Datei ersetzen ? > Ja )
( ich behalte Original Ordner , die Aenderungen speichern im neuen Ordner , wenn alles gut , denn Original Ordner löschen )

Code: Select all

F4:: 
	SendInput, ^y^s
	sleep, 5000
	SendInput, !s   
	sleep, 2000
    send,j
    sleep,1000
	WinClose, ahk_class IrfanView
	;ExitApp
return
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Freistellen erleichtern bei IrfanView

07 Feb 2020, 07:42

@Garry
Ich hatte die letzte Variante mit den Eistellungen von Lucky Joe gemacht.
Optionen/Einstellungen/Datei-Handling : Speichern/Umbenennen
kein Haken bei Fragen beim Überschreiben bei 'Speichern' und 'Speichern als' ( Lucky Joe )

Code: Select all

; getestet mit IrfanView 4.54 - 64 Bit - Deutsch
; AutoHotkey 1.1.32.00
; Windows 10 v1909 x64

; Bild in IrfanView laden und mit der Maus einen Rahmen ziehen
; F4 oder 5-Taste drücken
; Beide machen das gleiche:
; Das Bild wird beschnitten und unter demselben Namen gespeichert, dann wird IrfanView beendet

SetTitleMatchMode,2

F4:: 
	SendInput, ^y^s            ; beschneiden und Speicherdialog aufrufen
	WinWaitActive, Speichern ...,,3
	SendInput, !s	       ; Speicherdialog bestätigen (ALT+S)
	WinWaitActive, IrfanView,Datei ersetzen: ,3  
	SendInput, !j    
	sleep,500                          
	WinClose, ahk_class IrfanView,,2
	;ExitApp
return

F5:: 
; Einstellung bei Irfanview:
; Optionen/Einstellungen/Datei-Handling : Speichern/Umbenennen 
; kein Haken bei Fragen beim Überschreiben bei 'Speichern' und 'Speichern als' ( Lucky Joe )
; IrfanView Neustart ist nötig

	SendInput, ^y^s            
	WinWaitActive, Speichern ...,,3
	SendInput, !s	
	sleep,500
	WinClose, IrfanView,,2
	;ExitApp
return
Damit müsste die Wartezeit (sleep) minimiert sein.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Freistellen erleichtern bei IrfanView

07 Feb 2020, 09:30

@haichen,

zu einem WinWaitActive mit Zeitlimit gehört üblicherweise auch eine Prüfung auf Ablauf des Zeitlimits. ;)
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Freistellen erleichtern bei IrfanView

07 Feb 2020, 10:42

Uuuh ja, und bei WinClose kann ich die Zeit weglassen.
IrfanView ist ganz schön hartnäckig. Ich hatte es erst als einfach angesehen, aber leider übersehen, dass das zweite Fenster nicht richtig erkannt (unterschieden) wurde.
Neuer Versuch:

Code: Select all

; getestet mit IrfanView 4.54 - 64 Bit - Deutsch
; AutoHotkey 1.1.32.00
; Windows 10 v1909 x64

; Bild in IrfanView laden und mit der Maus einen Rahmen ziehen
; F4 oder 5-Taste drücken
; Beide machen das gleiche:
; Das Bild wird beschnitten und unter demselben Namen gespeichert, dann wird IrfanView beendet

SetTitleMatchMode,2

F4:: 
if WinActive("IrfanView") {
	SendInput, ^y^s            ; beschneiden und Speicherdialog aufrufen
	WinWaitActive, Speichern ...,,3
	if ErrorLevel
	   Return
	SendInput, !s	       ; Speicherdialog bestätigen (ALT+S)
	WinWaitActive, IrfanView,Datei ersetzen: ,3  
	if ErrorLevel
	   Return
	SendInput, !j    
	sleep,500
	WinClose,IrfanView
	ExitApp
}
return

F5:: 
; Einstellung bei Irfanview:
; Optionen/Einstellungen/Datei-Handling : Speichern/Umbenennen 
; kein Haken bei Fragen beim Überschreiben bei 'Speichern' und 'Speichern als' ( Lucky Joe )
; IrfanView Neustart ist nötig
if WinActive("IrfanView") {
	SendInput, ^y^s            
	WinWaitActive, Speichern ...,,3
	if ErrorLevel
	   Return
	SendInput, !s	
	sleep,500
	WinClose,IrfanView
	ExitApp
}
return
garry
Posts: 3740
Joined: 22 Dec 2013, 12:50

Re: Freistellen erleichtern bei IrfanView

07 Feb 2020, 11:24

haichen
@Garry
Ich hatte die letzte Variante mit den Eistellungen von Lucky Joe gemacht.
ja , sorry , danke , hab's übersehen
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Freistellen erleichtern bei IrfanView

12 Feb 2020, 16:57

Hallo haichen!

Hier hast Du aber wirklich gezaubert! Bei mir sind mit Deinem ersten Vorschlag (F4) die Extraeinstellungen von LuckyJoe nicht mehr nötig. :bravo:
Das ExitApp am Schluß habe ich entfernt, denn dadurch wurde immer gleich das ganze Script geschlossen. Das WinClose,IrfanView schließt bei mir den Irfan View immernoch nicht, aber ich mache das jetzt eben doch mit Esc. Ich habe den Code zum Schließen des ganzen Programms mittlerweile auf Strg+Esc umgestellt.
Dein von mir etwas veränderter Code sieht jetzt so aus:

Code: Select all

F4:: 
	SendInput, ^y^s            ; beschneiden und Speicherdialog aufrufen
	WinWaitActive, Speichern ...,,3
	if ErrorLevel
	   Return
	SendInput, !s	       ; Speicherdialog bestätigen (ALT+S)
	WinWaitActive, IrfanView,Datei ersetzen: ,3  
	if ErrorLevel
	   Return
	SendInput, !j    
	sleep,500
   	Send, {Esc}
return
Das if WinActive konnte ich ebenfalls weglassen, da das Script bei mir in einer ahk_group eingebettet ist.
Jetzt werde ich ausprobieren, wie sich das Ding als Compiled-Version auf den anderen Computern macht.

Nachtrag:
Ich habe gerade noch einiges ausprobiert und festgestell, daß man mit den WinWaitActive, ..-Befehlen die if ErrorLevel garnicht mehr benötigt. Nachdem ich diese gestrichen habe, funktioniert das Script mit und ohne die Häkchen in den Einstellungen oder wenn nur das erste (Speichern-Dialog) aktiviert ist. Das einzige Problem ist, daß das Schließen des IrfanView-Fensters sehr lange dauert, wenn die Häkchen herausgenommen sind (Einstellung nach LuckyJoe).
Ich weiß nicht, wie ich das ändern kann.
Deshelb hier nochmal die neueste Version:

Code: Select all

^F4:: 
	SendInput, ^y^s            ; beschneiden und Speicherdialog aufrufen
	WinWaitActive, Speichern ...,,3
	;~ if ErrorLevel
	;~ Return
	SendInput, !s	       ; Speicherdialog bestätigen (ALT+S)
	WinWaitActive, IrfanView,Datei ersetzen: ,3  
	;~ if ErrorLevel
        ;~ Return
	SendInput, !j    
	;~ sleep,500
	Send, {Esc}
return
Ach ja, zur Info: Ich arbeite hier gerade mit IrfanView 4.53 - 32Bit

Bis dahin viele Grüße von Meister Lampe
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Freistellen erleichtern bei IrfanView

13 Feb 2020, 05:14

Hallo Meister Lampe,
da du jetzt Lucky Joes Einstellungen benutzt, findet WinWaitActive kein Fenster das den Text "Datei ersetzen" enthält.
WinWaitActive bricht dann nach 3 sek mit Errorlevel=1 ab.
Da du if Errorlevel auskommentiert hast, kann das Skript trotzdem weiterlaufen.

Wenn du Lucky Joes Einstellungen beibehälst, könntest du auch WinWaitActive, IrfanView,Datei ersetzen: ,3 auskommentieren/löschen.
Mein zweites Beispiel war genau für die "Lucky Joe"-Einstellungen gedacht.

Die If Errorlevel-Abfrage und das if Winactive("Irfanview") fangen den Fall ab, das mal aus Versehen ^f4 in einem anderen Programm/Kontext gedrückt wird.
Da wären die Hotkeys möglicherweise problematisch.
Aber vielleicht ist das mit deinem ahk_group ja behandelt.

Schön das es läuft. :)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Rohwedder and 34 guests