Autor Beitrag
white-desert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: Fr 18.04.08 10:11 
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!
Einloggen, um Attachments anzusehen!
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
white-desert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: 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_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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)

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

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
white-desert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: Mi 23.04.08 10:06 
danke für eure schnellen antworten.

unter

msdn2.microsoft.com/...sk92a2ws(VS.71).aspx

ist eine liste der ws_ - messages.

da gibts eine message

ausblenden Quelltext
1:
WM_DROPFILES					


kann ich einfach einen hook fuer diese Message machen um diese msg dann abzufangen?
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Do 15.05.08 11:34 
falls du immernochnicht weißt wies geht:
hier n bsp:

ausblenden 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_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: 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

_________________
"Alles was du hast, hat irgendwann dich." Tyler Durden
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
Tex
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 17.05.08 17:44 
Ahh verstehe...

Das werd ich versuchen.

Besten Dank,

Tex

_________________
"Alles was du hast, hat irgendwann dich." Tyler Durden