Entwickler-Ecke

Windows API - Per Drag & Drop Dateipfad in gezogenes Feld einfuegen


white-desert - Fr 18.04.08 10:11
Titel: Per Drag & Drop Dateipfad in gezogenes Feld einfuegen
Hallo,

ich will eine datei vom explorer in ein beliebiges Eingabefeld eines beliebigen programms ziehen.
dort soll dann der dateipfad der gerade gezogenen datei beim "drop" eingefuegt werden.

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen

es soll also ein tool werden, mit dem man am schnellsten dateipfade überallhin einfügen kann.

mein status:

das handle eines eingabefeldes unter der maus herauszufinden und dort einen text eintippen zu lassen
ist gar kein problem (vieeeeeel hilfe hier im forum).

nur ...
- wie schafft man es ein globales, systemweites "ondrop" zu implementieren,
- wie kriegt man den dateipfad der gezogenen datei raus?

hooks fuer drag&drop habe ich nicht gefunden :-(
und einen hook fuer das klicken auf eine datei auch nicht :-(

wäre es irgendwie möglich, oder kann ichs gleich vergessen,
weil zu systemnah ist?

danke!


_frank_ - Fr 18.04.08 12:27

wenn ich dich richtig verstehe gibt es prinzipiell es 2 möglichkeiten, das zu realisieren.

1: eine eigene Edit-Klasse, die in sich das WM_DropFiles handled
2: das WM_DropFiles (forumlar-)global einfangen und das fenster-handle weitergeben.

im Anhang 2 funktionstüchtige Demos beider Varianten

//edit
ach du meinst ein fremdes Programm?
wenn ja, dann must du per SetWindowLong die WndProc umbiegen (was unter NT prozessübergreifend glaube nicht mehr so leicht möglich ist) und das edit-feld per SetWindowText setzen.
in dem Fall dürfte aber der Aufwand den Zweck nicht rechtfertigen ;) frag lieber den Programmierer, ob er das Feature implementiert...

HTH Frank


white-desert - Mo 21.04.08 15:00

Danke für deine Antwort. :-)

okey... das umbiege würde ich ja noch hinbekommen, aber
wie kriege ich sozusagen ein globales ondrop?


_frank_ - Mo 21.04.08 15:15

prinzipiell gibts dazu 2 Möglichkeiten (die mir einfallen) :)
1. Message-Hook
2. per setWindowLong die WindowProc (GWL_WndProc) umbiegen (unter NT/2K/XP prozessübergreifend nicht möglich [http://msdn2.microsoft.com/en-us/library/ms633591(VS.85).aspx])

mit beiden hab ich noch nicht so viel gemacht, um dir jetzt ein beispiel zu geben, aber schau dich mal im Forum, aber ich denke du wirst eh ersteres nehmen müssen ;)

Gruß Frank


white-desert - Mi 23.04.08 10:06

danke für eure schnellen antworten.

unter

http://msdn2.microsoft.com/en-us/library/sk92a2ws(VS.71).aspx

ist eine liste der ws_ - messages.

da gibts eine message


Quelltext
1:
WM_DROPFILES                    


kann ich einfach einen hook fuer diese Message machen um diese msg dann abzufangen?


Mr_Emre_D - Do 15.05.08 11:34

falls du immernochnicht weißt wies geht:
hier n bsp:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
  //vereinbaren:
    procedure WMDropFiles(var Msg:TMessage); message wm_DropFiles;

  // implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
  shellapi.DragAcceptFiles( form1.Handle, true ); // form1 kann nun reingedroppte files akzeptieren !
end;

procedure TForm1.WMDropFiles(var Msg: TMessage);
var hDrop, i, res: integer;
    Buffer: array[ 0..255 ] of char;
begin
   hDrop:= Msg.WParam;
   res:= DragQueryFile(hDrop,$FFFFFFFF,nil,0);
   for i:= 0 to res - 1 do 
   begin
     res:= DragQueryFile( hDrop, i, @Buffer, 255);
     showmessage( buffer );
   end;
end;


;)
PS: Hamma vor paar Tagen in der Schule durchgenommen :)

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


_frank_ - Do 15.05.08 11:40

er sucht eine Möglichkeit von fremden Anwendungen das Drag&drop abzufangen....
in der eigenen Anwendung ist das kein Problem :)

Gruß Frank


Mr_Emre_D - Do 15.05.08 11:47

akso, tja ich sollte lieber in Zukung die Frage durchlesen ...

hehe, sorry, aber vlt. hilft das ja jemandem ?!

MfG


Tex - Sa 17.05.08 16:57

Hi _frank_,

dein Beispiel von oben, dragedit2.zip, ist total klasse. Genau das brauch ich.
Allerdings bin ich noch nicht ganz durchgestiegen.

Dein Beispiel so wie es ist funzt bestens.
Ich habe jetzt noch auf die Form eine List Box gepackt und

in "TForm1.FormCreate" die Zeile "DragAcceptFiles(listbox1.handle,true);"
und in "TForm1.FormClose" die Zeile "DragAcceptFiles(listbox1.Handle,false);" hinzugefügt.


Das klappt aber leider nicht.
Was muss ich tun damit auch die ListBox den Drag akzeptiert?


Gruß,

Tex


_frank_ - Sa 17.05.08 17:35

die Sache ist die, dass ich den Text mittels SetWindowText setze.
beim Listview schlägt das fehl, da man dort ein Item adden müsste...du könntest aber die Message-Methode so abändern dass die prüft, ob das control hinter msg.unused (Handle) eine Listbox ist und entsprechend reagieren.

HTH Frank


Tex - Sa 17.05.08 17:44

Ahh verstehe...

Das werd ich versuchen.

Besten Dank,

Tex