Hotkey mit Pfad des aktiven Ordnerfensters Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Fraka
Posts: 11
Joined: 17 Feb 2017, 04:46

Hotkey mit Pfad des aktiven Ordnerfensters

19 Feb 2017, 09:24

Hallo zusammen,
wir/ich scheitern gerade an einer (vermeintlich) einfachen Aufgabe.
Das Programm everything.exe (ein Suchprogramm) soll auf Knopfdruck mit einem Parameter, der den aktuellen Verzeichnispfad enthält (offener, aktiver Ordner), ausgeführt werden.
Also z.B. C:\Program Files\Everything\Everything.exe -path "R:\This_Folder\shöüld be\searched\"

Momentan sieht das Skript folgendermaßen aus:

Code: Select all

#SingleInstance, Force

F7::
   For w In ComObjCreate("Shell.Application").Windows
   {
      If (WinActive("ahk_class CabinetWClass"))   ; -- v2
      {
         StringReplace, Folder, % w.document.folder.self.path, `%20, % A_Space, All
         Run, % "C:\Program Files\Everything\Everything.exe -path " chr(34) Folder chr(34)
      }
   }
Return
Es öffnet leider eine Instanz für jeden geöffneten Ordner (aber mit richtigem Parameter), nicht nur wie gewünscht für den aktiven.

Ich selbst habe nur sehr wenig Erfahrung mit AHK und der Syntax und das Skript in der Form nicht geschrieben, aber wenn ich das eher als Pseudo-code lese, sieht das doch sehr gut aus.

Der StringReplace ist eigentlich nur da, weil in einer alten Version des Skripts everything.exe mit parameter -url statt -path aufgerufen wurde (Leerzeichen durch %20 ersetzen).
Nehme ich den StringReplace aber in der neuen Version (mit -path) raus, dann öffnet er mir everything.exe mit dem Ordnerpfad des Desktops so oft, wie Ordner offen sind. Seltsam. Das Hauptproblem ist aber, dass er nicht den aktiven Ordner erkennt und immer alle aufmacht. Ob dann mit -url oder -path ist dann eher Kosmetik bzw. eine Sache von Everything.

Wo liegt der Fehler?

Viele Grüße und schon mal Danke für Hilfe,
Fraka

p.s.: Ich nutze momentan Windows 8.1 x64, wobei sich das in solchen Dingen kaum von Windows 10 unterscheiden sollte.
Rohwedder
Posts: 7630
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Hotkey mit Pfad des aktiven Ordnerfensters

20 Feb 2017, 01:18

Hallo,
zumindest bei mir mit noch Win7 gibt dieses Skript den Pfad des aktiven Dateiexplorers.
Wenn es unter Win8 noch funktioniert solltest du damit everything.exe aufrufen können.

Code: Select all

#SingleInstance, Force
#IfWinActive, ahk_class CabinetWClass
	F7::
		WinGet, ID, ID
		ControlGetText, Adresse, ToolbarWindow322, ahk_id %ID%
		MsgBox, %Adresse%
		path :=SubStr(Adresse, 10)
		MsgBox, %path%
	Return
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hotkey mit Pfad des aktiven Ordnerfensters  Topic is solved

20 Feb 2017, 03:32

Moin,

Code: Select all

   For w In ComObjCreate("Shell.Application").Windows
durchläuft eine Schleife über alle zeitgleich geöffneten Explorerfenster.

Code: Select all

      If (WinActive("ahk_class CabinetWClass"))   ; -- v2
Wenn mehrere Explorerfenster geöffnet sind, ist diese Bedingung für alle Fenster mit der Klasse CabinetWClass erfüllt. Das ist die Klasse für alle Fenster, die einen 'Ordner' anzeigen. Deshalb wird das Run Kommando für jedes dieser Fenster aufgerufen.

Mein Vorschlag:

Code: Select all

#SingleInstance, Force

#If WinActive("ahk_class CabinetWClass") ; kontextabhängiger Hotkey, nur für aktive Fenster der Klasse 'CabinetWClass' ausführen
F7::
   ActiveID := WinExist() ; ID des mit #If 'zuletzt gefundenen' Fensters
   For w In ComObjCreate("Shell.Application").Windows
   {
      If (w.HWND = ActiveID) ; wenn die ID (HWND) des Explorerfensters die des aktiven Fensters ist
      {
         StringReplace, Folder, % w.document.folder.self.path, `%20, % A_Space, All
         MsgBox, % w.document.folder.self.path
         ; Run, % "C:\Program Files\Everything\Everything.exe -path " chr(34) Folder chr(34)
         Break
      }
   }
   w := "" ; Objekt w freigeben.
Return
#If ; kontextabhängige Hotkeys beenden
Fraka
Posts: 11
Joined: 17 Feb 2017, 04:46

Re: Hotkey mit Pfad des aktiven Ordnerfensters

20 Feb 2017, 09:51

@Rohwedder
Danke für die Antwort. Leider funktioniert das in Windows 8 so nicht mehr.

@just me
Das mit der Schleife war mir klar, jedoch dachte ich, dass eben

Code: Select all

If (WinActive("ahk_class CabinetWClass"))   ; -- v2
nur das aktive Fenster herausfiltert. Danke für die Klärung.

Dein Vorschlag funktioniert übrigens hervorragend, ich betrachte das Thema also als gelöst! Vielen Dank!
Ich werde das Skript mit Verweis hierher auch in das Everything-Forum posten. Ich hoffe das ist ok, just me, hier steht es schließlich auch öffentlich?

Nach viel Pfusch erleichterte Grüße,
Fraka
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hotkey mit Pfad des aktiven Ordnerfensters

20 Feb 2017, 17:19

Moin,

noch eine Korrektur zur Fehlerursache:
Solange ein Fenster mit der Klasse CabinetWClass aktiv ist, ist die If-Bedingung für jedes Fenster in der Schleife erfüllt, und das unabhängig von seiner Klasse. Das dauert so lange, bis die Run-Anweisung ein neues Fenster mit einer anderen Klasse aktiviert. Und das kann schon mal länger dauern als der komplette Schleifendurchlauf.

Das Skript kannst du veröffentlichen wo immer Du willst (netterweise mit einem Verweis auf dieses Forum / diesen Thread).
Fraka
Posts: 11
Joined: 17 Feb 2017, 04:46

Re: Hotkey mit Pfad des aktiven Ordnerfensters

20 Feb 2017, 17:53

Ok, deine Aussage oben ist aber deswegen nicht wirklich falsch. Die zeitliche Komponente wird bei der irrsinnigen Ausführungsgeschwindigkeit des AHK Skripts (im Vergleich zur Ausführung von Everything) vermutlich eine untergeordnete Rolle spielen.
Dein Punkt ist ja, dass man theoretisch die Schleife (Öffnen aller Ordner durch Everything) mit der Aktivierung eines anderen Fensters (kein Ordner) noch schnell unterbrechen könnte?

In den Versuchen mit dem alten fehlerhaften Skript trat es meiner Erinnerung nach nämlich manchmal auch auf, dass das ausgeführte Programm (Everything) dann gar nicht aktiv im Vordegrund war, sondern einer der Ordner. Das spricht dafür, dass ... ach ne doch nicht, jetzt habe ich einen Knoten in meinem Gedankenfaden.

Da das Everything-Forum englischsprachig ist, habe statt nur einem Verweis auf diesen thread schlauerweise noch einen Verweis auf das Hauptforum gesetzt :ugeek:
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Hotkey mit Pfad des aktiven Ordnerfensters

21 Feb 2017, 03:44

... ach ne doch nicht, jetzt habe ich einen Knoten in meinem Gedankenfaden.
Einen ähnlichen Knoten hatte ich auch schon, siehe erste Antwort. ;)
Die Schleife wird in keinem Fall unter- oder abgebrochen. Wenn allerdings mittendrin ein Fenster einer anderen Klasse aktiv wird, greift Deine ursprüngliche If-Bedingung und die darunterliegende Run-Anweisung wird nicht ausgeführt.
... habe statt nur einem Verweis auf diesen thread schlauerweise noch einen Verweis auf das Hauptforum gesetzt.
Das ist auch gut so. ;)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 106 guests