Drag and Drop auf Toolbar

    • Offizieller Beitrag

    Ich habe ein kleines Problem.

    Und zwar möchte ich eine Datei vom Explorer auf die Toolbar in meinem Script ziehen. Im Prinzip klappt das auch.

    Ich habe als Extended-Style bei der GUI "$WS_EX_ACCEPTFILES" angegeben und bei der Toolbar "$TBSTYLE_REGISTERDROP".

    Somit erhalte ich bei $WM_NOTIFY einen Notification-Code "$TBN_GETOBJECT", wenn ich die Datei über der Toolbar bewege.

    Das Problem ist jetzt, wie bekomme ich den Dateinamen von der Datei heraus?

    Ich kriege eine piid, also wohl einen Pointer auf ein Objekt, aber was fange ich damit an? Wie kriege ich den Dateinamen raus?

    Hier mal ein Minimalbeispiel:

    • Offizieller Beitrag

    Funktioniert hier nicht das gleiche Schema, das du in deinem FileCommander angewendet hast?

    Im "alten" FileCommander habe ich keine echte Toolbar verwendet. Das sind "nur" normale Buttons und das Drag and Drop funktioniert über ein unsichtbares Label.

    Ich bin aber gerade dabei, den FileCommander von Grund auf neu zu schreiben und ich habe bereits die obere Toolbar und auch die Laufwerkbuttons als echte Toolbar.

  • Hallo Oscar ,

    eigentlich habe ich keine Antwort auf deine Frage. Falls aber auch $WM_DROPFILES in Ordnung wäre, habe ich hier etwas gefunden.

    Grüße autoiter

    • Offizieller Beitrag

    Falls aber auch $WM_DROPFILES in Ordnung wäre,

    Ja, die Funktion kenne ich bereits und das wäre evtl. eine Alternative, aber dabei wird die gesamte Gui als Ziel akzeptiert.

    Ich hätte aber gern nur die Toolbar. Eine Kombination aus beiden ist auch nicht so einfach, weil WM_NOTIFY vor WM_DROPFILES aufgerufen wird.

    Dann müsste ich das über globale Variablen anpassen.

    Da kann ich dann auch wieder ein transparentes Label benutzen. Damit klappt auch das interne @GUI_DragFile.

    Ich hatte halt die Hoffnung, dass man anhand der PIID irgendwie den Dateinamen herausbekommen könnte...

  • Statt einer Kombination von WM_NOTIFY vor WM_DROPFILES würde ich versuchen, in der WM_DROPFILES einen Check einzubauen, über welchem Control der Cursor ist, um das Drop-Event einem Control zuzuordnen.

    Ich hatte halt die Hoffnung, dass man anhand der PIID irgendwie den Dateinamen herausbekommen könnte...

    Naja warte mal ab. Hier gibt es ja deutlich hellere Geister als mich ;)

    Grüße autoiter

    • Offizieller Beitrag

    Ich würde etwa so vorgehen:

    - Permanent bei Öffnen eines Fensters prüfen, ob es der Explorer ist.

    --> Wenn ja: Verliert das Fenster den Fokus --> Auslesen welche Datei markiert ist. --> Folgt jetzt ein Datei-Drop-Event, kann es nur die gerade ausgelesene Datei sein.

    EDIT:

    Hier mal ein Bsp. wie du aus dem Explorer auslesen kannst.

    ACHTUNG: Mit Bibliotheken kann die Funktion nur bedingt umgehen. Dateinamen können gelesen werden, aber der Pfad zur Bibliothek nicht.

    • Offizieller Beitrag

    Hier mal ein Bsp. wie du aus dem Explorer auslesen kannst.

    Es ist nett von euch, mir Workaraounds vorzuschlagen, aber der einfachste Workaround ist ein transparentes Label unter der Toolbar (habe ich schon ausprobiert).

    Das funktioniert und vermutlich werde ich das wohl auch so machen. :/

    Ich hatte mich halt gefragt, warum es bei der Toolbar den Style "$TBSTYLE_REGISTERDROP" gibt und man bei WM_NOTIFY die Message "$TBN_GETOBJECT" bekommt, wenn man die "Quelle" (den Dateinamen) nicht ermitteln kann?

    Ich vermute, dass das irgendwie in dieser PIID (Pointer auf ein Object) steckt, aber ich konnte nicht herausbekommen, wie man das "dekodiert".

  • Du kannst auch einfach WM_DROPFILES überwachen. Das Drop-Event in WParam enthält einerseits alle Dateinamen, andererseits auch die Koordinaten des "Loslassens". Über ChildWindowFromPoint kannst du dir dann das entsprechende Control-Handle holen und schauen, ob es deine Toolbar ist.

    • Offizieller Beitrag

    Das Drop-Event in WParam enthält einerseits alle Dateinamen, andererseits auch die Koordinaten des "Loslassens". Über ChildWindowFromPoint kannst du dir dann das entsprechende Control-Handle holen und schauen, ob es deine Toolbar ist.

    Ja, ich denke, das ist als Workaround noch besser, als das transparente Label.

    Vermutlich werde ich diese Variante benutzen. Danke schön!

    Die Toolbar wird unter AutoIt scheinbar nicht so oft benutzt. Man findet im Netz nur sehr wenig Scripte dazu.