Drop ohne Drag, von Dateien?

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Drop ohne Drag, von Dateien?

21 Jan 2018, 09:39

Hat jemand einen Tip wie ich von Drag and Drop das Maus-Drag ersetzen kann durch Zuweisung eines Pfades.
Ich möchte beispielweise Dateien ueber einem Browser Upload Feld fallen lassen, diese aber nicht per Maus-Drag holen. Der Eingang (das Drag) soll durch eine simple Pfadzuweisung ersetzt werden.

Ein Drop ohne Drag bei dem ein Control direkt beim Ablegen angesprochen wird, wäre noch besser.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Drop ohne Drag, von Dateien?

21 Jan 2018, 10:42

Durch Drag & Drop wird das Label GuiDropFiles gestartet.
Das Besondere an diesem Label ist das automatisierte Bereitstellen einer Liste mit Dateipfaden, welche mit Zeilenumbrüchen `n getrennt sind.

Will man das Drag & Drop ersetzen, muss man einzig die automatisierte Erstellung der Dateiliste manuell durchführen.

Drag & Drop ersetzen, bedeutet somit eigentlich nur die Dateiliste selbst erstellen.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Drop ohne Drag, von Dateien?

21 Jan 2018, 10:59

Danke,
aber wie bekomme ich die Zeilen-Formatierte Pfad-Liste in ein Fenster-Control rein, welches auf das Drag and Drop Event lauscht?
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Drop ohne Drag, von Dateien?

21 Jan 2018, 11:04

Wenn wir hier von AHK sprechen, dann kannst Du das GuiDropFiles mit Goto GuiDropFiles ansprechen und, anstatt das A_GuiEvent, welches die automatisch erstellte Liste enthält, eine eigene Liste abarbeiten.

Wie man den Browser dazu bewegt, weiß ich nicht.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Drop ohne Drag, von Dateien?

21 Jan 2018, 13:41

Ich vermute ein Send- oder PostMessage Befehl kann das hin bekommen. Aber wie übergebe ich die Pfad-Liste? Oder einen einzelnen Pfad.
Wie klebe ich die Pfadliste an die virtuelle Maus beim Loslassen der Mausetaste?
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Drop ohne Drag, von Dateien?

21 Jan 2018, 16:40

Hmm, bei so wenigen Antworten, scheint Deine Frage schon sehr kniffelig zu sein.
Eine Methode fällt mir noch ein. Diese ist nicht professionell aber vielleicht funktioniert sie.
Probier doch mal, eine Liste mit Pfaden im ClipBoard mit Ctrl + v an den Browser zu schicken.

Das Windows-eigene "Als Pfad kopieren" (Shift + Rechte Mausklick auf eine Datei oder eine Auswahl von Dateien) kann da helfen.
Eventuell die "" Anführungszeichen, die Windows dabei benutzt, entfernen.

EDIT: Vielleicht kannst Du mit Ctrl + v direkt die Dateien an den Browser schicken. Dann müsstest Du, statt "Als Pfad kopieren", ganz normal mit "Ctrl + c" die gesamte(n) Datei(en) kopieren.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Drop ohne Drag, von Dateien?

22 Jan 2018, 03:54

divanebaba wrote:Das Windows-eigene "Als Pfad kopieren" (Shift + Rechte Mausklick auf eine Datei oder eine Auswahl von Dateien)
Danke divanebaba,
dies ist ein mir bisher entgangener nützlicher Befehl.
aber der Standart-Clipboard Inhalt beeinflusst Drag and Drop nicht, auch nicht wenn mitten im Drag and Drop der Clipboard-Inhalt via Fremdskript geändert wird.
Eine Art Spezial_Clipboard_für_Drag_and_Drop könnte es schon geben. Dann bräuchte ich genau darüber mehr Infos.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Drop ohne Drag, von Dateien?

22 Jan 2018, 04:29

Mir verschließt sich der höhere sinn der aktion. Wenn der pfad am ablageort (dropzone) fix ist, die pfadangaben am ausgangsort lediglich nicht per Mousedown abgegriffen werden sollen (noch keine ahnung was der auslöser für die alternative sein soll) dann sprechen wir doch über nichts anderes als die "simple" übergabe/injection einer datei(liste) in eine webseite, oder? Geht das nicht per bookmarklet über die adresszeile des browsers?? Was ist denn die adresse der webseite (zum anschaun)???
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Drop ohne Drag, von Dateien?

22 Jan 2018, 09:55

Moin,

Drag&Drop benutzt das Clipboard allenfalls ganz am Anfang als Datenquelle. Die eigentliche Aktion wird über ein "Datenobjekt" abgewickelt, das in der Handhabung recht kompliziert ist.

Du kannst aber versuchen, das Clipboard mit Dateipfaden zu füttern und per Strg+v in das Feld zu bringen. Je nachdem, was das Feld erwartet, kann es dafür schon ausreichen, wenn man die Pfade als Text in das Clipboard schreibt, also

Code: Select all

Clipboard := "..."
Wenn nicht, kannst Du versuchen, den für das Kopieren von Dateien über das Clipboard vorgesehenen Bereich zu füllen:

Code: Select all

ClipboardSetFiles(FilesToSet, DropEffect := "Copy") {
   Static SizeT := A_IsUnicode ? 2 : 1 ; size of a TCHAR
   Static PreferredDropEffect := DllCall("RegisterClipboardFormat", "Str", "Preferred DropEffect")
   Static DropEffects := {1: 1, 2: 2, Copy: 1, Move: 2}
   ; -------------------------------------------------------------------------------------------------------------------
   ; Count files and total string length
   TotalLength := 0
   FileArray := []
   Loop, Parse, FilesToSet, `n, `r
   {
      If (Length := StrLen(A_LoopField))
         FileArray.Push({Path: A_LoopField, Len: Length + 1})
      TotalLength += Length
   }
   FileCount := FileArray.Length()
   If !(FileCount && TotalLength)
      Return
   ; -------------------------------------------------------------------------------------------------------------------
   ; Add files to the clipboard
   If DllCall("OpenClipboard", "Ptr", A_ScriptHwnd) && DllCall("EmptyClipboard") {
      ; hMem format ---------------------------------------------------------------------------------------------------
      ; 0x42 = GMEM_MOVEABLE (0x02) | GMEM_ZEROINIT (0x40)
      hMem := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", 20 + (TotalLength + FileCount + 1) * SizeT, "UPtr")
      pMem := DllCall("GlobalLock", "Ptr", hMem)
      Offset := 20
      NumPut(Offset, pMem + 0, "UInt")         ; DROPFILES.pFiles = offset of file list
      NumPut(!!A_IsUnicode, pMem + 16, "UInt") ; DROPFILES.fWide = 0 --> ANSI, fWide = 1 --> Unicode
      For Each, File In FileArray
         Offset += StrPut(File.Path, pMem + Offset, File.Len) * SizeT
      DllCall("GlobalUnlock", "Ptr", hMem)
      DllCall("SetClipboardData", "UInt", 0x0F, "UPtr", hMem) ; 0x0F = CF_HDROP
      ; Preferred DropEffect format ------------------------------------------------------------------------------------
      If (DropEffect := DropEffects[DropEffect]) {
         hMem := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", 4, "UPtr")
         pMem := DllCall("GlobalLock", "Ptr", hMem)
         NumPut(DropEffect, pMem + 0, "UChar")
         DllCall("GlobalUnlock", "Ptr", hMem)
         DllCall("SetClipboardData", "UInt", PreferredDropEffect, "Ptr", hMem)
      }
      DllCall("CloseClipboard")
   }
   Return
}
FilesToSet ist eine Liste von Dateipfaden, die durch `n oder `r`n getrennt sind.

Edit: Ich habe gerade bemerkt, dass das noch eine ältere Version der Funktion war. Ich habe die Zeile Static DropEffects := ... korrigiert. Diese Variable dient zur Unterscheidung von Copy- und Move-Aktionen und spielt für Deine Aktionen keine Rolle (Du solltest immer bei Copy bleiben). Weitere 'Fehler' sind mir nicht aufgefallen.
Last edited by just me on 22 Jan 2018, 11:24, edited 1 time in total.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Drop ohne Drag, von Dateien?

22 Jan 2018, 09:59

BoBo wrote:Mir verschließt sich der höhere sinn der aktion. Wenn der pfad am ablageort (dropzone) fix ist, die pfadangaben am ausgangsort lediglich nicht per Mousedown abgegriffen werden sollen (noch keine ahnung was der auslöser für die alternative sein soll) dann sprechen wir doch über nichts anderes als die "simple" übergabe/injection einer datei(liste) in eine webseite, oder? Geht das nicht per bookmarklet über die adresszeile des browsers??
Der Sinn ist genau die "simple" übergabe/injection einer datei(liste) an ein beliebiges Drag and Drop-fähiges Control eines Fensters unabhängig davon um welches Ziel-Fenster es sich handelt. Bspw. Uploads von Browsern, Kopieraktionen bei normalen Explorer-Fenstern und viele mehr (eben alle die Pfade per Drag and Drop akzeptieren).
BoBo wrote:Was ist denn die adresse der webseite (zum anschaun)???
Der Auslößer war die Automatisierung der Uploads bei https://github.com/Grrdi/ZackZackOrdner/upload/master

PS. fuer die Empfangs-Richtung bin ich schon fuendig geworden. https://gist.github.com/Aatoz/
aber ich suche die Sende-Richtung.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
divanebaba
Posts: 804
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Drop ohne Drag, von Dateien?

22 Jan 2018, 19:00

Hallo.
Zunächst einmal
@just me: Vielen Dank, just me, Du hast mir den Tag versaut. Ich weiß immer noch nicht, was Deine Funktion ClipboardSetFiles macht. Mir tut der Kopf weh.
@Gerdi: Wenn Dir "Als Pfad kopieren" gefällt, hier eine Erweiterung, die diese Funktion in das ganz normale Kontextmenü einbindet.
Die Erweiterung heißt Clickie. Für XP ein Muss. Für Win7 eine Empfehlung. Einmal installiert und fertig. Keine sonstigen Anforderungen.
Für Deine "Injektion", wie BoBo es so schön nannte, bin ich leider zu ungebildet und kann dazu nichts beitragen.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Drop ohne Drag, von Dateien?

23 Jan 2018, 03:43

Moin,
divanebaba wrote:@just me: Vielen Dank, just me, Du hast mir den Tag versaut. Ich weiß immer noch nicht, was Deine Funktion ClipboardSetFiles macht. Mir tut der Kopf weh.
Ich kenne das. Als ich mich vor einiger Zeit an den internen Aufbau des Clipboards bzw. der Clipboard-Formate herangetastet habe, ging es mir genauso. ;)

Microsoft hat diese Informationen schön über das MSDN verteilt. Man findet sie z.B. unter Für den Transfer von Dateien gibt es das Clipboardformat CF_HDROP bzw. die DROPFILES Struktur. Und genau die baut die Funktion auf.

Die Struktur enthält am Ende einen Bereich variabler Länge mit einer Liste von Dateipfaden, die voneinander durch 1 oder 2 (ANSI / Unicode) NULL Bytes getrennt sind und mit 2 oder 4 NULL Bytes abgeschlossen werden. Deshalb versucht die Funktion zunächst einmal, die Länge des Speicherbereichs für diese Liste zu ermitteln. Danach wird das Clipboard mit OpenClipboard() geöffnet und mit EmptyClipboard() geleert Dann wird die DROPFILES Struktur in einem globalen Speicherbereich (er muss global sein!) angelegt, gefüllt und schließlich mit SetClipboardData() ins Clipboard geschrieben. Nun wird das Clipboard mit CloseClipboard() geschlossen und enthält jetzt ein CF_HDROP Format.

Der Teil mit dem PreferredDropEffect ist in diesem Fall irrelevant. Darüber wird lediglich versucht, dem Ziel zu übermitteln, ob die Dateien 'bevorzugt' kopiert (copy) oder verschoben (move) werden sollen.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Drop ohne Drag, von Dateien?

23 Jan 2018, 04:37

Danke just me,
Danke allen anderen Beteiligten,

ich melde mich gegebenenfalls nach einer genauen Sichtung nochmal.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 25 guests