![]() |
Dateinamen in Fenster Droppen
Hallo,
ich möchte gern einen Vorgang automatisieren. Bei uns ist es erforderlich, pdf-Dateien mittels Drag & Drop z.B. vom Explorer in ein Programm zu ziehen. Die entsprechenden Dateien bzw. Dateinamen sind mir bekannt. WinSpy sagt mir leider nur, dass das Ziel ein „SunAwtFrame“ ist. Das scheint etwas mit ![]() Ich würde jetzt gern von meinem Programm aus dieses Programm starten und die - mir bekannten (Siehe oben) - Dateien dort einfügen. Ich habe natürlich hier schon das eine oder andere zu dem Thema gefunden. Das meiste scheint sich aber damit zu beschäftigen, Dateien mit einem Delphi-Programm anzunehmen. Ich würde sie aber gern „abgeben“. Wo bzw. mit welchen Suchworten kann ich mich idealer Weise diesem Thema nähern? |
AW: Dateinamen in Fenster Droppen
Hast du dich mal mit den DragFiles von Angus Johnson beschäftigt? Damit kann man ein Shell-Drag-Event starten, müsste man sie nur irgendwie am Ziel droppen.
|
AW: Dateinamen in Fenster Droppen
Zitat:
Die Demo zu
Delphi-Quellcode:
habe ich mir angesehen und auch dieses
WM_DROPFILES
![]() ![]() In der Theorie muss ich "nur" so etwas ähnliches wie das hier (nicht funktionierend) tun:
Delphi-Quellcode:
Allerdings liegen Theorie und Praxis und hier auch mein Verständnis manchmal etwas auseinander. Mich wundert auch, dass ich im www kein Beispiel zu diesem Thema finde. Ich kann mir nicht vorstellen, der einzige weltweit mit diesem Problem zu sein. Es kann doch eigentlich nur daran liegen, dass ich mit den falschen Schlagworten suche.
procedure TFormMain.SpeedButton1Click(Sender: TObject);
var wndMain : HWND; wndList : TStringList; FilesHandle: THandle; begin wndMain := FindWindow('TFormMain','WM_DROPFILES demo'); if (wndMain <> 0) then begin wndList:= TStringList.Create; try wndList.Add('aFile.txt'); FilesHandle:= ConvertFilesToShellIDList('d:\', wndList); SendMessage(wndMain, WM_DROPFILES, FilesHandle, 0); finally wndList.Free; end; end; end; Daher ja meine Frage... |
AW: Dateinamen in Fenster Droppen
vielleicht nach ConvertFilesToShellIDList suchen?
gruss |
AW: Dateinamen in Fenster Droppen
Zitat:
bsp. Ich habe ein Video. Wenn ich dieses jetzt vom Explorer auf mein Icon in meinem Prog.. OTTB ziehe dann öffnet sich das Programm zu dem dieses Icon gehört und spielt die Datei ab die ich mit Drag und Drop auf das Icon aus einer anderen Anwendung(OTTB) gedropt habe. Ist es das was du meinst? gruss |
AW: Dateinamen in Fenster Droppen
Hallo,
nein, er will Dateien, dessen Pfad/Name bekannt ist, einem anderen Programm (Java?) automatisch per Drag&Drop schicken. Etwa so: ![]() |
AW: Dateinamen in Fenster Droppen
Ok.. Habe es dann doch falsch verstanden.
Danke. gruss |
AW: Dateinamen in Fenster Droppen
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Nach der Grippewelle habe ich mir den Code angesehen. Egal was ich mache, die Dateinamen kommen zwar an, werden aber auseinandergepflückt. Kurz gesprochen kommt jedes Zeichen extra an. Um das zu verdeutlichen, habe ich einen Screenshot sowie meine Demos angehängt (ausnahmesweise auch als exe-Dateien, damit man nicht z.B. den Empfänger kompilieren muss). Dass es am Empfänger liegt, schließe ich aus. Denn wenn man z.B. vom Desktop Dateien auf ihn dropt, werden die korrekt angezeigt. Ich habe die Vermutung, dass es am Unterschied zwischen AnsiString und WideString liegt. Ein simples Umdeklarieren hat aber leider nichts gebracht. Ich habe die Strings einzeln zerlegt, vorher in ein String umgewandelt etc. Nur leider bringt das alles nichts, so dass ich mal wieder auf dem sprichwörtlichen Schlauch stehe. Hat noch jemand Ideen? |
AW: Dateinamen in Fenster Droppen
Hmm..
(Nur mal über den Source geschaut..) Dir ist schon bewust, das 'S : String;' immer noch ein WideString (Ab D2009/D2010) ist? Da müsste schon 'S : AnsiString;' stehen, damit aus dem Wide/Unicodestring ein AnsiString wird.. ;) Edit Unter D6 kompiliert funktioniert dein Sender, aber hier ist ein String = AnsiString ;) |
AW: Dateinamen in Fenster Droppen
Zitat:
Mit Typecast klappt es nun tatsächlich. Danke! Ich habe bloß das Problem, dass der SecSigner und/oder Java hart zu sein scheint. Ich schaffe es nicht, meine Dateinamen in diesen zu droppen. Ich habe auch ein ![]() Scheinbar dann doch alles für die Katz :evil: |
AW: Dateinamen in Fenster Droppen
Hmm...
Zitat:
Typecast? Oder hast Du aus S : String; einfach S : AnsiString; gemacht ? |
AW: Dateinamen in Fenster Droppen
Es gibt mehrere Varianten für Drag&Drop
z.B. Message (WM_DROPFILES) oder ![]() und dann gibt es auch noch das Drag&Drop, was in der VCL eingebaut ist, und das nur innerhalb von Delphi-Anwendung funktioniert. Manche Programme nehmen alles an oder nur Eins von Beiden. Merkt man z.B. schön, beim Drag&Drop auf fremden Programmen ins Eigene implementieren möchte. (Explorer, Thunderbird oder MS Outlook ... Explorer kann Alles, Thunderbird nimmt die Messages und Outlook das Interface) und beim Interface gibt es auch wieder mehrere Möglichkeiten, wo wieder mehreres gleichzeitig oder immer zufällig nur das genutzt wird, was dein Programm grade nicht implementiert hat :stupid: |
AW: Dateinamen in Fenster Droppen
Hmm..
Ein weiterer Fehler ist die Verwendung von DragInfo! DragInfoW führt bei Verwendung mit Notepad als Ziel dazu, dass Notepad meldet, die Datei nicht zu finden. Seitens MS ist hier DROPFILES zu verwenden. ![]() Hiermit können ANSI wie WideString Filenamen verwendet werden (mit fWide = True für WideString).
Delphi-Quellcode:
type
// DROPFILES structure PDropFiles = ^_DROPFILES; _DROPFILES = record pFiles: DWORD; { init with SizeOf(_DROPFILES) } pt: TPoint; fNC: BOOL; fWide : BOOL end; TDropFiles = _DROPFILES; Mit meiner angepassten MakeDrop müsste es sowohl mit Ansi, wie auch Wide funktionieren. Konnte es aber nur mit D6 testen. Als Ziel habe ich Notepad und ein eigenes Tool (mit DragQueryFileW) für die Drops zum Testen verwendet.
Delphi-Quellcode:
function MakeDrop(const FileNames: TStrings): HDROP;
var I, DataSize, Size: Integer; Data: PDropFiles; P: PChar; begin // berechne notwendig Speichergröße DataSize := SizeOf(TDropFiles); for I := 0 to FileNames.Count-1 do begin Size := (Length(FileNames[I]) * SizeOf(Char)) + SizeOf(Char); Inc(DataSize, Size); end; inc(DataSize, SizeOf(Char)); // Für abschließendes #0 Char // alloziere den speicher Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); if Result <> 0 then begin Data := GlobalLock(Result); if Data <> nil then try FillChar(Data^, DataSize, 0); // Fülle daten Data.pFiles := SizeOf(TDropFiles); Data.fWide := (SizeOf(Char) > 1); // Am Ende des headers nun die filenamen getrennt mit #0 P := PChar(Cardinal(Data) + Data.pFiles); for I := 0 to FileNames.Count-1 do begin Size := (Length(FileNames[I]) * SizeOf(Char)) + SizeOf(Char); Move(PChar(FileNames[I])^, P^, Size ); Inc(P, Size); end; finally GlobalUnlock(Result); end else begin GlobalFree(Result); Result := 0; end; end; end; |
AW: Dateinamen in Fenster Droppen
Hallo,
Du hast ja den SecSigner erwähnt. Was willst Du denn mit dem konkret machen? Du kannst den SecSigner ja auch mit dem Dateinamen als Parameter starten. PS: Ich wusste gar nicht, dass der auch Drag&Drop kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz