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.
Drop ohne Drag, von Dateien?
Moderator: jNizM
Drop ohne Drag, von Dateien?
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: Drop ohne Drag, von Dateien?
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.
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.
Re: Drop ohne Drag, von Dateien?
Danke,
aber wie bekomme ich die Zeilen-Formatierte Pfad-Liste in ein Fenster-Control rein, welches auf das Drag and Drop Event lauscht?
aber wie bekomme ich die Zeilen-Formatierte Pfad-Liste in ein Fenster-Control rein, welches auf das Drag and Drop Event lauscht?
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: Drop ohne Drag, von Dateien?
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.
Wie man den Browser dazu bewegt, weiß ich nicht.
Re: Drop ohne Drag, von Dateien?
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?
Wie klebe ich die Pfadliste an die virtuelle Maus beim Loslassen der Mausetaste?
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: Drop ohne Drag, von Dateien?
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.
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.
Re: Drop ohne Drag, von Dateien?
Danke divanebaba,divanebaba wrote:Das Windows-eigene "Als Pfad kopieren" (Shift + Rechte Mausklick auf eine Datei oder eine Auswahl von Dateien)
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.
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
Re: Drop ohne Drag, von Dateien?
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)???
Re: Drop ohne Drag, von Dateien?
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
Wenn nicht, kannst Du versuchen, den für das Kopieren von Dateien über das Clipboard vorgesehenen Bereich zu füllen:
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.
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 := "..."
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
}
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.
Re: Drop ohne Drag, von Dateien?
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: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 Auslößer war die Automatisierung der Uploads bei https://github.com/Grrdi/ZackZackOrdner/upload/masterBoBo wrote:Was ist denn die adresse der webseite (zum anschaun)???
PS. fuer die Empfangs-Richtung bin ich schon fuendig geworden. https://gist.github.com/Aatoz/
aber ich suche die Sende-Richtung.
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: Drop ohne Drag, von Dateien?
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.
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.
Re: Drop ohne Drag, von Dateien?
Moin,
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.
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.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.
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.
Re: Drop ohne Drag, von Dateien?
Danke just me,
Danke allen anderen Beteiligten,
ich melde mich gegebenenfalls nach einer genauen Sichtung nochmal.
Danke allen anderen Beteiligten,
ich melde mich gegebenenfalls nach einer genauen Sichtung nochmal.
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
Who is online
Users browsing this forum: No registered users and 44 guests