![]() |
Datei mit Standard-App öffnen und auf Beendigung warten
Hallo,
ich möchte unter Windows 10 aus einem Delphi 2010-Programm heraus Dateien mit der zugewiesenen Standard-App öffnen und warten bis diese Standard-App (z.B. die Foto-App) wieder geschlossen wird. Eine Datei mit einer bekannten Anwendung öffnen und warten mache ich mit "CreateProcess" und "WaitForInputIdle". Das funktioniert. Um die Datei mit der zugewiesenen Standard-App zu öffnen verwenden ich "ShellExecute". Das öffnen klappt, nur wie kann ich auf die Beendigung warten? Gibt es andere Methoden oder Verfahrensweisen? Die Suche hat leider nichts für mich brauchbares ergeben, zumal ich mit Englisch so meine Probleme habe. Gruß Klaus |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Hallo,
vielleicht hilft Dir "ShellExecuteAndWait" weiter, z. b. ![]() Gruß Frank |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Du solltest die externe Anwendung mit
![]() ![]() |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Zitat:
Aber ob das für alle Dateien klappt, wage ich zu bezweifeln, da mache Anwendungen die "Datei" an andere Instanzen weitergeben und sich dann beenden. |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Eine andere
![]() |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Erstmal schauen was die Standard-Anwendung ist. (HKEY_CLASSES_ROOT)
z.B. in der Registry die Dateiendung suchen und prüfen ob es etwas zum OPEN gibt Wenn du "Glück" hast, dann ist da eine EXE verlinkt und wie man diese ausruft (meistens "xxxxx.exe %1") Das kannst du dann mit ShellExecute ausführen. Ist ein DDE-Server verlinkt, dann startest du Diesen ( ![]() und zu dem sollte dann auch geschrieben stehen mit welcher Aktion darin dann das Document übergeben wird. PROBLEMe wird es immer geben, wenn die gewünschte Anwendung nicht direkt gestartet wird, sondern "nur" ein Launcher, denn diese starten dann die eigentlich Anwendung, übergeben die Daten und beenden sich vorzeitig. z.B. siehe MS Office, OpenOffice oder Delphi (das nutzt aktuell einen DDE-Server in der bdsLauncher.exe der die bds.exe startet) |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Zitat:
|
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Zitat:
Danke trotzdem für den Rat. Gruß Klaus |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Zitat:
Laut Roadmap kommen die Zukünftig als Standard ins Delphi. Ich habe noch nicht geschaut wie diese Komponente es macht, aber ich denke das läuft genauso über die hier beschriebenen API's |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Zitat:
Dank. Gruß Klaus |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Zitat:
Gruß Klaus |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Hallo,
ShellExecuteEx liefert dir das Prozess-Handle (Feld hProcess) der Standard-App. Danach weiter mit deinem WaitForXXX Heiko |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Zitat:
Bei einer WindowsApp (z.B.: Foto-App) funktioniert dies leider nicht. Auch in der Registry finde ich nichts, wie ich die App erkennen und starten kann. Zitat:
Zitat:
Mir ist deshalb folgende Idee gekommen, für die ich gerade ein Testprogramm schreibe: Ich schreibe unmittelbar vor und nach dem Aufruf mit ShellExecute alle ProzessID in jeweils eine Liste. Die Differenz beider Listen müsste mit hoher wahrscheinlichkeit die ProzessID der gestarteten Anwendung sein. Ich kann dann darauf reagieren. Ich kann dies aber erst am Wochenende weiter testen und prüfen ob und wie mir Windows dazwischen funkt. Ich melde mich dann wieder. Danke, Gruß Klaus. |
AW: Datei mit Standard-App öffnen und auf Beendigung warten
Hallo,
ich viel probiert und getestet und verwende jetzt folgenden Code:
Delphi-Quellcode:
Die bisherigen Tests auf meinem Rechner liefen alle erfolgreich. Die Funktion wartet immer (auch bei Windows10-Apps) auf deren Beendigung.
function ExecAndWait2(Filename, Params: String; WindowState: Word = SW_SHOWNORMAL): Integer;
const cError = -1; cWait = 0; cNoWait = -2; var ShExecInfoW : SHELLEXECUTEINFOW; ExitInfo : PExitThreadDebugInfo; wndLstAll, wndLst : TStringList; i, a : Integer; procedure AllProcessToLst(Lst: TStringList); function EnumWindowsProcA(Wnd: HWND; LParam: TStringList): BOOL; stdcall; begin result := True; if IsWindowVisible(Wnd) then begin LParam.Add(IntToStr(Wnd)); end; end; begin EnumWindows(@EnumWindowsProcA, integer(Lst)); end; begin Result := cError; if (Filename <> '') and FileExists(FileName) then begin ShExecInfoW.Wnd := GetForegroundWindow; ShExecInfoW.cbSize := SizeOf(SHELLEXECUTEINFOW); ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoW.lpVerb := 'open'; ShExecInfoW.lpFile := PWideChar(WideString(Filename)); ShExecInfoW.lpParameters := PWideChar(WideString(Params)); ShExecInfoW.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename))); ShExecInfoW.nShow := WindowState; wndLstAll := TStringList.Create; try AllProcessToLst(wndLstAll); if ShellExecuteExW(@ShExecInfoW) then begin result := cNoWait; try if ShExecInfoW.hProcess <> 0 then begin WaitForInputIdle(ShExecInfoW.hProcess, INFINITE); New(ExitInfo); FillChar(ExitInfo.dwExitCode, SizeOf(ExitInfo.dwExitCode), 0); repeat Application.ProcessMessages; sleep(500); GetExitCodeProcess(ShExecInfoW.hProcess, ExitInfo.dwExitCode); until not(ExitInfo.dwExitCode = STILL_ACTIVE); Dispose(ExitInfo); Result := cWait; end else // neues Handle ermitteln und auf dessen Beendigung warten: begin wndLst := TStringList.Create; try sleep(500); // warten bis App geöffnet ist AllProcessToLst(wndLst); for i := wndLst.Count - 1 downto 0 do if wndLstAll.IndexOf(wndLst[i]) > -1 then wndLst.Delete(i); if wndLst.Count > 0 then // auf Beendigung warten: begin repeat Application.ProcessMessages; sleep(500); wndLstAll.Clear; AllProcessToLst(wndLstAll); a := 0; for i := 0 to wndLst.Count - 1 do if wndLstAll.IndexOf(wndLst[i]) > -1 then inc(a); until a < wndLst.Count; result := cWait; end; finally wndLst.Free end; end; finally CloseHandle(ShExecInfoW.hProcess); end; end; finally wndLstAll.Free; end; end; end; Danke an alle Helfer. Ein schönes Wochenende. Gruß Klaus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 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