Mehrere Objekte mit der Maus markieren

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

14 Mar 2018, 09:03

Mein Fehler, sorry!

Code: Select all

SendInput, +{LButton}
Das dein Code überhaupt etwas tut, liegt höchstwahrscheinlich daran, dass AHK wegen des führenden + 'Operators' die ersten zwei Zeilen verbindet. Aus

Code: Select all

#Lbutton::
	+LButton
wird wieder

Code: Select all

#Lbutton::+LButton
Das ist dann eine einzeilige Neubelegung/Umbelegung einerTastenkombination und der folgende Code wird nicht ausgeführt.
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

04 Apr 2018, 17:01

Hallo!

Also das mit dem Aufrufen durch den Mausbutton klappt jetzt einwandfrei.
Ich bräuchte nun immernoch einen Trick, damit der Zeiger wieder zur ersten markierten Datei zurückspringt. Das ist ja eigentlich immer diejenige, die man auch zuerst angeklickt (wenn man die Bilder nicht rückwärts markiert). Könnte man also vor dem Befehl +LButton noch diese Datei (bzw. deren Adresse) abspeichern, um dann später zu ihr zurückzuspringen? Und wie realisiert man das?

Viele Grüße von Meister Lampe
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

05 Apr 2018, 04:37

Moin,

ich hätte da noch eine recht simple Idee. Wenn Du immer 'von oben nach unten' markierst, könntest Du Dir den Namen der zuerst markierten Datei über einen Hotkey holen. Die könntest Du dann immer als erste Datei umbenennen und anschließend in der Liste übergehen.
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

28 Jul 2018, 16:14

Hallo just me!

Ich muß jetzt nochmals nachhaken, wegen einem anderen Problem im Zusammenhang mit Euren Empfehlungen. Ich hatte das Script hingekriegt - zwar noch nicht so perfekt, wie ich es mir vorgestellt habe, aber es funktionierte. Dazu habe ich die von Dir empfohlene Fumktion

Code: Select all

StrReplace(DateienAuswahl , "`n", "`n", DateienAnzahl) ; <<<<<< zählt die Anzahl der Zeilenvorschübe in der Variablen DateienAnzahl
verwendet. Das ging auch alles ganz gut. Bis ich den Code auf einem anderen PC öffnen und laufen lasssen wollte. Dann kam die Fehlermeldung des Editors:

Code: Select all

==> Call to nonexistent function.
     Specifically: StrReplace(DateienAuswahl , "
", "
", DateienAnzahl)
>Exit code: 2    Time: 0.6663
Ich arbeite mit einer relativ neuen AHK-Version (1.1.28.00). Daran kann es doch wohl nicht liegen.
Hast Du eine Idee?

Viele Grüße von Meister Lampe
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

29 Jul 2018, 06:00

Moin,

wie man in der Doku nachlesen kann, ist die Funktion StrReplace() mit 1.1.21.00 eingebaut worden. Das war immerhin Ende März 2015, ist also schon etwas her.
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

02 Oct 2018, 12:23

Hallo!

Da bin ich wieder.
Mir ist ein anderer Gedanke gekommen. Ich habe mich daran erinnert, daß Ihr mir zu einem anderen Zweck der Verarbeitung mehrerer Dateien bereits einmal die Verwendung von FileMove empfohlen habt. Den damaligen Code habe ich jetzt soweit verändern können, daß er annähernd das tut, was ich mit dem bisherigen vornehmen wollte.
Ich habe die Parse-Schleife folgendermaßen umgeschrieben:

Code: Select all

 Loop, Parse, BilderAuswahl, `n, `r
   {
	  SplitPath, A_LoopField, , Verzeichnis, Erweiterung, LetzteNummer
	  LetzterIndex := SubStr("000" . LetzterIndex, -2)  ; Setzt Index auf 1 in 2 Ziffern
	  LetzteNummer = %AktSign%_%LetzteSign%-%LetzterIndex%
	  LetzterIndex := ++LetzterIndex
	  FileMove, %A_LoopField%, %Verzeichnis%\%LetzteNummer%.%Erweiterung%
   }
return
Das klappt eigentlich ganz gut, sogar mit dem Vorzug, daß es unabhängig davon läuft, ob die Dateinamenserweiterungen ausgeblendet sind oder nicht.
Es gibt jetzt nur noch eine Schwierigkeit und die ähnelt der bei der letzten Methode:
Wenn die Schleife fertig und die Umbennenung abgeschlossen ist, dann bleiben alle bearbeiteten Dateien markiert. Bei dem anderen Script hatte ich es mit Send{Tab} so einrichten können, daß dann gleich die nächste Datei markiert wird - und nur die.
Gibt es eine Möglichkeit, das hier auch hinzubekommen?

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

05 Oct 2018, 12:03

Hallo!
just me wrote: ich hätte da noch eine recht simple Idee. Wenn Du immer 'von oben nach unten' markierst, könntest Du Dir den Namen der zuerst markierten Datei über einen Hotkey holen. Die könntest Du dann immer als erste Datei umbenennen und anschließend in der Liste übergehen.
Das wäre auch Möglichkeit für das in meinem letzten Post beschriebene Problem.
Aber wie erkenne ich den Namen einer Datei um ihn abzuspeichern und wie steuere ich sie später wieder damit an - insbesondere, nachdem sie umbenannt worden ist?
Im Tutorial finde ich zwar einige Keys, um Fenster per ID zu erkennen und zu aktivieren, aber wie man das mit einzelnen Dateien - bei mir sind es Bilder - macht, steht dort nicht.
Das Kniflige dabei wird wohl sein, daß ich nicht nur die Adresse/ID des angeklickten Bildes abspeichern muß, sondern daß auch gleichzeitig alle anderen dadurch markierten Dateien zum Umbenennen in die Variable "BilderAuswahl" abgespeichert werden müssen.

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

10 Oct 2018, 04:16

Hallo!

Hätte doch jemand von Euch noch eine Idee?
Es wäre schön, wenn ich dieses Projekt mal endlich fertig bekäme.
Und ich habe halt nur dieses Forum, mit dem ich mich darüber austauschen kann. Keiner meiner bekannten hat schon was von AHK gehört... :(

Viele Grüße von Meister Lampe
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

10 Oct 2018, 04:39

Moin,

ich würde Dir schon helfen wollen. Ich verstehe aber nicht ganz, wohin Du willst. Oben finden sich meiner Meinung nach mehrere offene Enden. Also bitte noch einmal ganz konkret und detaillert: Welches Problem soll nun mit welcher Lösung behoben werden?
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

10 Oct 2018, 13:14

Hallo just me!

Also das war's. Es ging hier ein bißchen durcheinander, insbesondere, weil ich nicht mehr an den älteren Thread gedacht hatte, der sich mit der ähnlichen Frage beschäftigte und ich auch ohne es zu wollen ganz ähnlich benannt hatte Mehrere markierte Dateien behandeln.
Meine weiterführenden Fragen hier im Thread ab dem 13.März 2018 (s.u.) würden eigentlich da herein gehören, aber ich hatte zu diesem Zeitpunkt eben dort schon damit begonnen und dachte auch nicht, daß sich daraus noch weiteres ergeben würde. Die eigentliche, sich auf den Titel beziehende Frage war da schon geklärt.
Meister Lampe wrote:
just me wrote:Moin,

Du meinst wohl Mehrere markierte Dateien behandeln.
Ich verstehe immer noch nicht, wie Du das Problem mit der Reihenfolge über die Bestimmung der Anzahl lösen willst. Markierst Du die Dateien in einem Explorerfenster?
Ja, genau. Diese Bilder stammen aus einem Scanvorgang und sind dort in einem Standardschema benannt worden (z.B. img001, img002, ...). Aber die Reihenfolge ist schon so, wie ich sie benötige.
Wenn ich sie umbenne, dann müssen sie zu einzelnen Einheiten zusammengefaßt werden: Z.B. Nr.001_01..Nr.001_10, Nr.002_01..Nr.002_07, ...
Zu diesem Zweck habe ich mir bereits ein für meine Bedürfnisse ganz zufriedenstellendes AHK-Script entworfen. Wenn ich im Umbennenmodus statt den neuen Namen einer Datei den ersten Zählparameter x, dan Komma und dann den zweiten y eingebe, so werden alle darauffolgenden nach dem Schema Nr. x_1 - Nr.x_y benannt. Nur dazu muß ich auch den Parameter y wissen. Statt immer abzuzählen oder zu makieren und Eigenschaften aufzurufen, möchte ich diesen Arbeitsgang mit einbauen.

Viele Grüße von Meister Lampe
Das Umbenennen-Tool hatte ich seitdem immer wieder etwas verbessert, insbesondere durch Deinen Tip mit dem StrReplace. Was aber allen diesen Versuchen gemeinsam ist, ist die Vorgehensweise beim Umbenennen: Angefangen von der ersten Datei, die dazu erst einzeln (!) angesteuert und markiert werden muß, nachdem zuvor alle zusammen markiert wurden, werden alle weiteren nacheinander durch eine Schleife abgearbeitet, wobei der Zeiger mit Tab jeweils zur nächsten springt und die Schleife bei der durch die mit StrReplace herausgefundene Dateienzahl abschließt. Danach springt der Zeiger nochmals einen Schritt weiter, damit man gleich bei der nächsten Datei weitermachen kann.

Jetzt hatte ich mich aber der anderen Möglichkeit entsonnen, stattdessen mit einem Array zu arbeiten, das dann in einer Schleife mit FileMove durchgearbeitet wird. Sowas Ähnliches hattest Du mir ja bereits schonmal in dem anderen Thread vorgeschlagen. Ich habe das jetzt auch versucht und schon ganz gut hinbekommen, wie ich am 2.Oktober berichtete. Damit gibt es aber noch Schwierigkeiten:
- Die Dateien bleiben nach Durchgang der Schleife markiert. Ich würde aber gerne wie bei der anderen Lösung danach gleich den Zeiger auf die nächste Datei setzen.
- Meine Idee dazu: die Adresse der letzten Datei merken und nachher wieder aufrufen, dann Tab. Man könnte das vielleicht über die Array-Nummer machen.
- Aber wie spreche ich eine Datei an und aktiviere sie?

Soweit ist im Augenblick der aktuelle Stand.

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

19 Oct 2018, 17:50

Hallo just me!

Es wäre schön, wenn ich wenigstens das eine Problem, das sich schon seit langem durch diesen und den anderen Thread zieht, gelöst bekäme:

Wie kann ich die Adresse, den Namen, die ID sonst eine eindeutige Angabe von einer Datei, die ich in einem Ordner innerhalb des Windows Explorer anklicke oder markiere, erhalten und wie kann ich diese Datei nach später wieder mithilfe dieser Angabe ansteuern?
Letztlich hatte ich nur deshalb verschiedene Methoden ausprobiert, weil ich bisher keine Lösung für dieses Problem gefunden hatte, du mir aber schon länger auf eine Lösung Hoffnung gemacht hast:
just me wrote:
ich hätte da noch eine recht simple Idee. Wenn Du immer 'von oben nach unten' markierst, könntest Du Dir den Namen der zuerst markierten Datei über einen Hotkey holen. Die könntest Du dann immer als erste Datei umbenennen und anschließend in der Liste übergehen.
Eigentlich ist der Rest des Programms ja fertig und soweit möglich auch getestet.

Viele Grüße von Meister Lampe
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

20 Oct 2018, 02:51

Moin Meister,

mein Problem ist immer noch, dass ich Deins vielleicht nicht verstehe.

Das Skript soll ja wohl für den Hausgebrauch oder zumindest für einen eng begrenzten Personenkreis sein. In diesem Fall hat man meiner Meinung nach immer die Möglichkeit, Mausaktionen wie hier den 'Markierungsklick in ein Explorerfenster' auf einen Hotkey umzubiegen. Das liefert dann die Möglichkeit, den kompletten Pfad der markierten Datei einzulesen, am einfachsten über Strg+c und die Zwischenablage.
User avatar
nnnik
Posts: 3699
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

20 Oct 2018, 03:34

Es gibt glaube ich die Möglichkeit den Windows Explorer per COM zu steuern.
Ich habe aber keine Details und weiß nicht mehr wo und ob ich diese Info aus der AHK Hilfe habe.
Recommends AHK Studio
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

20 Oct 2018, 12:13

Hi nnnik,

zum Thema COM. ;)
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

20 Oct 2018, 13:05

Hallo just me!

Das Script ist nicht für den Hausgebrauch (vielleicht auch verwertbar), sondern für meine Arbeit beim Signieren von Scans, die ich von Originalen im Rahmen der Digitalisierung von Akten u.a. in unserem Archiv erstelle. Dabei haben wir unsere eigene Ordnungsschemen, deshalb auch die für außerhalb stehende Leute etwas merkwürdige Nummerierung. Vorgegeben ist dabei der Name des Bestandes, danach kommt die Nummer der Akte darin und dann die Seite innerhalb der Akte. Weil ich Variablen leider nicht dauerhaft speichern kann, um sie dann je nach Bestand zu ändern, muß diese dazu im Code vorgegeben werden. Das hatte ich wohl vergessen, Dir ebenfalls mitzuteilen. Es steht im Script oben z.B. die Zeile

Code: Select all

AktSign := "X 12--3"
um nachher in der die Signaturen für den Bestand X 12/3 generieren zu können.
Im Allgemeinen liegen die Scans schön nacheinander, sowohl die Akten, als auch die Seiten darin. Die Idee ist deshalb die, daß zuerst alle umzubenennenden Scans ein und derselben Akte markiert werden und diese dann automatisch mit der nächsthöheren Nummer von 0 an aufwärts durchgezählt werden. Aber es gibt natürlich immer mal wieder Ausnahmen, wo etwas fehlt oder anders signiert werden muß. Deshalb öffnet sich dabei eine InputBox zur Bestätigung, die die vorhergesehene Signatur %LetzteSign% anzeigt und in die man auch direkt einen anderen Vorschlag geben kann. Soll die Zählung mit einem anderen Index als Null beginnen, so gibt man diesen mit einem Komma davor ein. Beides läßt sich auch kombinieren. Das ist der erste Teil des eigentlichen Codes:

Code: Select all

!LButton::
	SendInput, +{LButton} 
	
	Clipboard := ""	
	SendInput, ^c
	Clipwait, 1
	If ErrorLevel 										; abbrechen, wenn keine Dateien im Clipboard
	{
		MsgBox, Sie müssen mindestens eine Datei markieren!
		return
	}
	else
	
	BilderAuswahl := Clipboard
	StrReplace(BilderAuswahl , "`n", "`n", BilderAnzahl) ; zählt die Anzahl der Zeilenvorschübe in der Variablen BilderAnzahl
	VorschauAnzahl := BilderAnzahl +1
	LetzteSign := SubStr("0000" . ++LetzteSign, -3)		 ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
	InputBox, BoxSign, Vorschau, "Es werden %VorschauAnzahl% Bilder umsigniert", , 225, 125, , , , ,%LetzteSign%
	If ErrorLevel
	{
		LetzteSign := LetzteSign -1
		return
	}
	else
		
	IfNotInString, BoxSign, ,							; Prüft, ob ein anderer Startidex durch Komma getrennt eingegeben wurde
	{
		LetzteSign := SubStr("0000" . BoxSign, -3)		; Setzt eine neu gewählte Signatur auf 4 Ziffern
		LetzterIndex := 0  								; Setzt Index auf 0
	}	
	else
	{	
		StringSplit, BoxArray, BoxSign, `,
	
		If (BoxArray1 = "")
		{
			LetzteSign := SubStr("0000" . ++LetzteSign, -3)	; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
		}
		else
			LetzteSign := SubStr("0000" . BoxArray1, -3)	; Setzt neue Signatur auf 4 Ziffern
		
		LetzterIndex := BoxArray2
	}
	
return
Jetzt fehlt nur noch der eigentliche Umbenennenvorgang. Mit der InputBox wurden bereits alle Parmeter dazu generiert. Mit Enter auf OK wurde sie geschlossen. Jetzt könnte eigentlich die Sache sofort beginnen, wenn die erste Datei der umzubenennenden Dateien angesteuert, aktiviert bzw. markiert wäre. Stattdessen sind immernoch alle Dateien markiert und ich muß noch immer manuell die erste Datei ansteuern und dann ein zweites Script starten (mit NumpadAdd):

Code: Select all

NumpadAdd::
	Send, {F2}
	ParamIndex := VorschauAnzahl
	
	Clipboard := ""	
	SendInput, ^c
	Clipwait, 1
	GanzerName := Clipboard
	SplitPath, GanzerName, , , Erweiterung
	
Loop , %ParamIndex%
		{
			LetzterIndex := SubStr("000" . LetzterIndex, -2)  ; Setzt Index auf 1 in 2 Ziffern
			LetzteNummer = %AktSign%_%LetzteSign%-%LetzterIndex%%Erweiterung%
			Send, %LetzteNummer%
			LetzterIndex := ++LetzterIndex
			Send, {Tab}{F2}
		}
return
Das ist jetzt im Prinzip die Version, mit der ich als erste ins Rennen gegangen bin (also nicht die mit dem FileMove), nur etwas optimiert, damit die Signierung unabhängig von der Einstellung der Dateinamenerweiterung (ein-/ausgeblendet) funktioniert.
Mein Traum ist jetzt, die beiden Module endlich zusammen zu fügen, damit ich sie nicht immer separat starten muß.
Ich hoffe, Dir ist jetzt klar, wohin ich will.

Viele Grüße von Meister Lampe
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

26 Oct 2018, 04:18

Moin,

ich glaube, ich verstehe jetzt, wo Dich der Schuh drückt. Ich denke, dass man das Problem über das Shell-Objekt bzw. die Shellfenster-Objekte lösen kann. Du kannst ja mal folgenden Code ausprobieren. Das Ganze geht davon aus, dass Du zuerst eine Datei auswählst und die Auswahl dann mit Alt+LButton nach unten erweiterst. Ich habe das nur unter Win 10 grob antesten können. Wenn Dir der Ansatz gefällt, können wir an den Feinheiten noch arbeiten.

Code: Select all

#NoEnv
Sendmode, Input
SetBatchLines, -1
ShellApp := ComObjCreate("Shell.Application")
AktSign := "X 12--3"
Auswahl := []
LetzteDatei := ""
LetzteSign := 0
Return
; --------------------------------------------------------------------------------------------------
#IfWinActive ahk_class CabinetWClass ahk_exe explorer.exe ; Angaben für Win 10
!LButton::
   ; Explorerfenster bestimmen
   ExplorerID := WinExist()
   ShellWin := 0
   For Win In ShellApp.Windows {
      If (Win.HWND = ExplorerID) {
         ShellWin := Win
         Break
      }
   }
   If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
      Return
   ; Auswahl nach unten erweitern
   Send, +{LButton}
   ; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
   If !(ShellWin.Document.SelectedItems.Count > 0) { ; keine Auswahl
      MsgBox, Sie müssen mindestens eine Datei markieren!
      Return
   }
   Auswahl := []
   For Item In ShellWin.Document.SelectedItems
      Auswahl.Push(Item.Path)
   LetzteDatei := Auswahl.RemoveAt(1)  ; erste (bzw. letzte) Datei aus dem Array entfernen ...
   Auswahl.Push(LetzteDatei)           ; ... und wieder anhängen
   Anzahl := Auswahl.Length()
   ; Benutzereingaben zum Umbenennen holen
   LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
   InputBox, BoxSign, Vorschau, "Es werden %Anzahl% Bilder umsigniert", , 225, 125, , , , ,%LetzteSign%
   If (ErrorLevel) {
      LetzteSign--
      Return
   }
   If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
      LetzteSign := Format("{:04}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := 0 ; Setzt Index auf 0
   }
   Else {
      StringSplit, BoxArray, BoxSign, `,
      If (BoxArray1 = "")
         LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
      Else
         LetzteSign := Format("{:04}", BoxArray1) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := BoxArray2
   }
   ; Dateien umbenennen
   For Index, Datei In Auswahl {
      SplitPath, Datei, DateiName, , Erweiterung
      ; Datei selektieren
      ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
      ShellWin.Document.SelectItem(ShellWin.Document.Folder.ParseName(DateiName), 29)
      Send, {F2}
      LetzterIndex := Format("{:02}", LetzterIndex)  ; Setzt Index auf 1 in 2 Ziffern
      LetzteNummer = %AktSign%_%LetzteSign%-%LetzterIndex%%Erweiterung%
      ToolTip, %Datei%`n->`n%LetzteNummer%
      Sleep, 1000
      ; Send, %LetzteNummer%
      LetzterIndex++
      Send, {Tab}{F2}
   }
   ; Fertig
   ShellWin := ""
   Send, {Esc}
Return
#IfWinActive
; --------------------------------------------------------------------------------------------------
Die Send Anweisung für das Umbenennen ist auskommentiert. Dafür habe ich einen ToolTip und ein Sleep eingefügt.
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

21 Nov 2018, 17:55

Hallo just me!

Leider klappt es mit Deinem Script noch nicht. Im besten Fall läuft das - ziemlich langsam übrigens - über die ausgewälten Bilder und macht garnichts. Wenn ich den ToolTip-Befehl und das Sleep wieder ausblende und das Send aktiviere, dann benennt es die erste Datei um, verhaspelt sich aber an der nächsten und vermurkst dann ein oder zwei Namen, läuft aber nicht alle durch.

Mir ist jetzt aber noch eine andere Idee gekommen, wie man die Sache vielleicht auch anpacken könnte:
Wenn ich die Bilder auswähle, so geschieht das ja, indem ich die erste einfach anklicke und dann auf die zweite mit angehaltener Alt-Taste klicke. Könnte man jetzt bereits durch das Herunterdrücken der Alt-Taste eine Abspeicherung der Adresse der zuerst angklickten Datei auslösen? Dann würde erst anschließend, wenn die linke Maustaste gedrückt wird, die eigentliche Markierung aller Bilder vorgenommen. Ab da würde das erste Modul dann laufen wie bisher und müßte vor Beginn des zweiten auf diese abgespeicherte Adresse zurückspringen.
Wäre das Problem so leichter zu lösen?

Viele Grüße von Meister Lampe
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

22 Nov 2018, 04:57

Moin,

mir ging es erst einmal darum zu klären, ob das Skript sauber über alle ausgewählten Dateien läuft. Wenn dabei nach jedem Dateiwechsel eine Sekunde gewartet wird (Sleep, 1000), wundert es mich nicht, dass es 'ziemlich langsam' läuft.

Ich habe versucht, möglichst nah bei Deinen vorhandenen und lauffähigen Skripten zu bleiben. Wie ich es verstanden habe, besteht das Problem ja in erster Linie darin, die Auswahl im Explorerfenster zu verändern. Ich habe dabei vielleicht etwas übertrieben. Möglicherweise laufen die Send Anweisungen das Verändern der Auswahl im Explorerfenster über COM nicht mehr synchron, wenn man die Sleep Anweisung entfernt. Das Setzen der Auswahl ist aber anscheinend nur einmal erforderlich, bevor das Umbenennen startet. Deshalb kommt hier noch ein letzter Versuch:

Code: Select all

#NoEnv
Sendmode, Input
SetBatchLines, -1
ShellApp := ComObjCreate("Shell.Application")
AktSign := "X 12--3"
Auswahl := []
LetzteDatei := ""
LetzteSign := 0
Return
; --------------------------------------------------------------------------------------------------
#IfWinActive ahk_class CabinetWClass ahk_exe explorer.exe ; Angaben für Win 10
!LButton::
   ; Explorerfenster bestimmen
   ExplorerID := WinExist()
   ShellWin := 0
   For Win In ShellApp.Windows {
      If (Win.HWND = ExplorerID) {
         ShellWin := Win
         Break
      }
   }
   If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
      Return
   ; Auswahl nach unten erweitern
   Send, +{LButton}
   ; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
   If !(ShellWin.Document.SelectedItems.Count > 0) { ; keine Auswahl
      MsgBox, Sie müssen mindestens eine Datei markieren!
      Return
   }
   Auswahl := []
   For Item In ShellWin.Document.SelectedItems
      Auswahl.Push(Item.Path)
   LetzteDatei := Auswahl.RemoveAt(1)  ; erste (bzw. letzte) Datei aus dem Array entfernen ...
   Auswahl.Push(LetzteDatei)           ; ... und wieder anhängen
   Anzahl := Auswahl.Length()
   ; Benutzereingaben zum Umbenennen holen
   LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
   InputBox, BoxSign, Vorschau, "Es werden %Anzahl% Bilder umsigniert", , 225, 125, , , , ,%LetzteSign%
   If (ErrorLevel) {
      LetzteSign--
      Return
   }
   If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
      LetzteSign := Format("{:04}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := 0 ; Setzt Index auf 0
   }
   Else {
      StringSplit, BoxArray, BoxSign, `,
      If (BoxArray1 = "")
         LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
      Else
         LetzteSign := Format("{:04}", BoxArray1) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := BoxArray2
   }
   ; Erste Datei selektieren
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
   Datei := Auswahl[1]
   SplitPath, Datei, DateiName, , Erweiterung
   ShellWin.Document.SelectItem(ShellWin.Document.Folder.ParseName(DateiName), 29)
   Sleep, 100
   Send, {F2}
   ; Dateien umbenennen
   For Index, Datei In Auswahl {
      LetzterIndex := Format("{:02}", LetzterIndex)  ; Setzt Index auf 1 in 2 Ziffern
      LetzteNummer = %AktSign%_%LetzteSign%-%LetzterIndex%%Erweiterung%
;       ToolTip, %Datei%`n->`n%LetzteNummer%
;       Sleep, 1000
      Send, %LetzteNummer%
      LetzterIndex++
      Send, {Tab}{F2}
   }
   ; Fertig
   ShellWin := ""
   Send, {Esc}
Return
#IfWinActive
; --------------------------------------------------------------------------------------------------
Hier scheint das zu klappen.
User avatar
Meister Lampe
Posts: 69
Joined: 06 Apr 2014, 13:28

Re: Mehrere Objekte mit der Maus markieren

22 Nov 2018, 18:52

Hallo just me!

Das ist jetzt schon ein großer Schritt vorwärts und kommt meinen Vorstellungen schon recht nahe.
Ich habe jetzt mal das Signaturbeispiel "X 12--3" durch eine andere Signatur ("A 96--1") ersetzt. Wenn ich mir vom Scanner dann die Dateien z.B. im Format "x-image_001" ausgeben lasse, also beginnend nit einem hinterem Buchtaben im Alphabeth, dann verrutschen sie auch beim Umbenennen nicht im Explorer. Das nur nebenbei.

Zwei Sachen haben beim ersten Ausprobieren noch Schwierigkeiten gemacht:
1.) Die Sache mit den Dateinamenerweiterungen. Diese werden anscheinend lediglich nochmals hinten angehängt. Ein Bild namens "scan_123.bmp" wird also z.B. zu "A 96--0123bmp.bmp". Oder, wenn man beim Zusammensetzen von %LetzteNummer% wieder einen Punkt dazwischen fügt, wird eben "A 96--0123.bmp.bmp" daraus. Ich habe das jetzt aus der Synthese von %LetzteNummer% herausgenommen - und siehe da - das scheint auch ohne zu klappen. Egal ob die Erweiterungen ausgeblendet sind oder nicht.
2.) "Überschreiben": Habe ich einmal 4 hintereinanderliegende Bilder umbenannt und ich sehe, daß eigentlich die zwei dahinter liegenden ebenfalls noch mit dazugehören, so ginge es am einfachsten, alle 6 nochmals zusammen zu markieren und unter derselben Signatur (die dann statt der vorgeschlagenen erneut eingegeben wird) durchlaufen zu lassen. Wenn ich das versuche, läuft das Programm aber nur über die ersten 4 bereits beim vorhergehenden Mal umbenannten Dateien und benennt sie neu, und das dann mehrmals und solange, bis die Schleife fertig ist. Ich habe keine Ahnung warum. So oder so ähnlich gehjt das jedesmal, wenn beim Umbenennen eine Datei dabei ist, die beim letzten Vorgang ebenfalls dabei war.
3.) Und schließlich noch ein Hinweis. Ich werde dieses Tool dann als compilierte Version benutzen müssen, da wir im Archiv den AHK leider nicht installiert bekommen (Angeblich aus Sicherheitsgründen). Dort habe ich Win 10. Hier zuhause noch Win 7.

Viele Grüße von Meister Lampe - und Danke für Deine Geduld!

PS.: Wo hast Du eigentlich all diese Kenntnisse fürs Programmieren in AHK her? In dem Tutorial im Internet stehl lange nicht so viel. Und ich habe noch nie von irgendwelcher Anleitungsliteratur gehört.
just me
Posts: 5715
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mehrere Objekte mit der Maus markieren

24 Nov 2018, 04:27

Hallo,

ich war mit der Send Lösung zum Umbenennen nie wirklich zufrieden. Wenn man die Dateien über das ShellWindow Objekt des Explorerfensters ermittelt, gibt es auch die Möglichkeit, das quasi im Hintergrund zu erledigen. Probiere das mal aus:

Code: Select all

#NoEnv
Sendmode, Input
SetBatchLines, -1
ShellApp := ComObjCreate("Shell.Application")
AktSign := "X 12--3"
Auswahl := []
LetzteDatei := ""
LetzteSign := 0
Return
; --------------------------------------------------------------------------------------------------
#IfWinActive ahk_class CabinetWClass ahk_exe explorer.exe ; Angaben für Win 10
!LButton::
   ; Explorerfenster bestimmen
   ExplorerID := WinExist()
   ShellWin := 0
   For Win In ShellApp.Windows {
      If (Win.HWND = ExplorerID) {
         ShellWin := Win
         Break
      }
   }
   If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
      Return
   ; Auswahl nach unten erweitern
   Send, +{LButton}
   ; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
   If !(ShellWin.Document.SelectedItems.Count > 0) { ; keine Auswahl
      MsgBox, Sie müssen mindestens eine Datei markieren!
      Return
   }
   SelectedItems := []
   For Item In ShellWin.Document.SelectedItems
      SelectedItems.Push(Item)
   LetzteDatei := SelectedItems.RemoveAt(1)  ; erste (bzw. letzte) Datei aus dem Array entfernen ...
   SelectedItems.Push(LetzteDatei)           ; ... und wieder anhängen
   Anzahl := SelectedItems.Length()
   ; Benutzereingaben zum Umbenennen holen
   LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
   InputBox, BoxSign, Vorschau, "Es werden %Anzahl% Bilder umsigniert", , 225, 125, , , , ,%LetzteSign%
   If (ErrorLevel) {
      LetzteSign--
      Return
   }
   If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
      LetzteSign := Format("{:04}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := 0 ; Setzt Index auf 0
   }
   Else {
      StringSplit, BoxArray, BoxSign, `,
      If (BoxArray1 = "")
         LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
      Else
         LetzteSign := Format("{:04}", BoxArray1) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := BoxArray2
   }
   ; Dateien umbenennen
   ShellWin.Document.SelectItem(SelectedItems[1], 4)
   For Index, Item In SelectedItems {
      ItemPath := Item.Path
      SplitPath, ItemPath, DateiName, , Erweiterung
      LetzterIndex := Format("{:02}", LetzterIndex)  ; Setzt Index auf 1 in 2 Ziffern
      Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex . "." Erweiterung
      LetzterIndex++
   }
   ; Fertig
   ; Letzte Datei selektieren
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
   ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
   For Index, Item In SelectedItems
      Item := ""
   ShellWin := ""
Return
#IfWinActive
; --------------------------------------------------------------------------------------------------
Das läuft hier anscheinend zuverlässig, dauert bei 25 Dateien aber einige Zeit. Wenn Du das nutzen willst, solltest du vielleicht während der Verarbeitung ein 'Aktivitätsanzeigefenster' ausgeben.

Meine Programmierkenntnisse stehen auf zwei Säulen. Die Grundlagen habe ich im Großrechnerbereich mit einer 'Ausbildung' in Form von mehreren Kursen erworben. Das, was mit AHK bzw. Windows zusammenhängt, habe ich mir dann viel später selbst beigebracht.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: animagus46, Gerdi, Rohwedder and 8 guests