![]() |
Fremdes Programm beenden - Handle anhand Filename ermitteln
Hallo DP'ler,
ich suche seit 2 Tagen hier im Forum nach der richtigen Lösung - und seh' wahrscheinlich den Wald vor lauter Bäumen nicht mehr! Mit ShellExecuteEx kann der Nutzer sich Bilder, PDF- und HTML-Files eines Patienten anzeigen lassen. Funktioniert einwandfrei. Wird nun der nächste Patient aufgerufen, dann möchte ich, daß alle Fenster, die mit ShellExecuteEx erstellt wurden, auch wieder geschlossen werden. Mit ENumWindow (ich glaube der Code ist von Lucky) kann ich mir alle Fensterbezeichnungen in einer ListBox anzeigen lassen. Mein Problem: Wie komme ich über diese Bezeichnung zur Prozess-ID (z.B. Adobe), damit ich dieses Programm beenden kann? Vielen Dank für Eure Hilfe Ines |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Hast Du
![]() |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Wenn du doch diese startest, dann Merk dir diese in einer Liste und beende diese dann (siehe Link von DeddyH)
Denn nicht jedes Programm (z.B. Adobe Reader) wurde von dir gestartet, es sei denn das ist beabsichtigt. |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Die Liste liefert auch das Handle. damit kann man WM_LOSE an das Fenster senden.
|
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Das mit WM_CLOSE (:mrgreen:) wurde auch im verlinkten Thread genannt.
|
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Zitat:
|
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Zitat:
|
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Hallo und Danke für Eure Hilfe!
Den Thread habe ich gelesen - habe aber Probleme, das richtige Handle zu ermitteln. Der Rückgabewert von ShellExecuteEx scheint nicht das Fensterhandle zu sein (oder ich bin zu dumm!). Mein Problem habe ich jetzt folgendermaßen gelöst: Ich habe in GetWindows eine Abfrage eingebaut, die nach dem nicht zu löschenden Dateinamen sucht. Wenn vorhanden, dann habe ich ja das Handle und kann das Fenster mit Sendmessage (hwnd, WM_Close, SC_Close) beenden. Das dürfte dem Nutzer die größtmöglichste Freiheit geben - mal' schauen. Viele liebe Grüße Ines |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Wie im verlinkten Thread bereits gesagt würde ich die Fenster durchgehen und die Prozesshandles vergleichen:
![]() |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfo.lpVerb := nil; ShExecInfo.lpFile := PChar('NotePad.exe'); ShExecInfo.lpDirectory := nil; ShExecInfo.nShow := SW_Show; if not ShellExecuteEx(@ShExecInfo) then Showmessage(IntToStr(GetLastError)); end; procedure TForm1.Button2Click(Sender: TObject); begin TerminateProcess(ShExecInfo.hProcess,0); CloseHandle(ShExecInfo.hProcess); ODER: su. SendMessage(FindMainWindow(7964),WM_Close,0,0); end;
Delphi-Quellcode:
type
PEnumInfo = ^TEnumInfo; TEnumInfo = record ProcessID: DWORD; HWND: THandle; end; function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall; var PID: DWORD; begin GetWindowThreadProcessID(Wnd, @PID); Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND)); if not Result then EI.HWND := WND; end; function FindMainWindow(PID: DWORD): DWORD; var EI: TEnumInfo; begin EI.ProcessID := PID; EI.HWND := 0; EnumWindows(@EnumWindowsProc, Integer(@EI)); Result := EI.HWND; end; |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Guten Morgen!
Nochmals zu meinem Problem - das ich hoffentlich jetzt gelöst habe. Der Arzt kann sich via FTP alle Files eines Patienten lokal auf seinen PC laden. Er hat dann die Möglichkeit, sich diese Files mit ShellExecuteEx anzeigen zu lassen - kann aber auch über z.B. Explorer und Doppelklick solch ein File öffnen. Werden jetzt Files vom nächsten Patienten geladen - dann muß das lokale Verzeichnis zuerst geleert werden. Wird z.B. noch ein pdf-File vom vorherigen Patienten angezeigt, dann scheitern alle Löschbemühungen. Da ich nicht weiß, ob mein Programm die Fenster mit ShellExecuteEx geöffnet hat oder der Arzt via Explorer usw. dies getan hat funktioniert die Abfrage in GetWindows nach der nicht zu löschenden Datei am besten. Außerdem will ich z.B. Adobe auch nicht komplett abschießen, da der Arzt eventuell eine Publikation über ein bestimmtes Krankheitsbild geöffnet hat und die Files mit diesen Ergebnissen vergleichen will. Ich danke Euch allen für Eure Mühe und auch für die Codebeispiele, die mir sehr geholfen haben. Viele Grüße aus Augsburg Ines |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Manchmal kann es auch wirklich sinnvoll sein, dem User nicht seinen Brei direkt in den Mund zu schaufeln sondern ihn auch mal kauen zu lassen. Mit anderen Worten: Wenn der User zum nächsten Patienten will und noch Dateien offen sind, soll der User die offenen Fenster gefälligst selber zumachen, also entsprechende Meldung raus und weiter gehts. Klar ist der Computer nicht die Kernkompetenz des Arztes, aber wenn das Programm erst gar keine Intelligenz beim User voraussetzen kann, wozu isses dann für Ärzte? :mrgreen: Hoffentlich ist der Bediener nicht Chirurg und vergisst auch öfter mal was im Patienten... :mrgreen:
|
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Das hängt vom eigenen Anspruch und der eigenen Sichtweise ab.
Wenn es möglich wäre und in sich logisch schlüssig (und die Usability erhöht) warum nicht realisieren. So Dialoge wie "Um Fortzufahren müssen Sie zwingend xyz.pdf schließen" Ja ich will fortfahren (diese Absicht habe ich kundgetan) und der Rechner weiß wie man den Zustand herstellt, dass ich fortfahren kann, dann soll der das gefälligst auch machen. Es ist eine Gratwanderung zwischen Unterstützung und Bevormundung. Wichtigstes Kriterium ist aber als Kernfrage "Wie schaffe ich es, dass der Anwender in seinem Arbeitsfluss nicht gestört wird?" Es geht niemals um ein paar Klicks, sondern dass der Anwender in dem Moment eine andere Aufmerksamkeit hat wo diese (vermeidbaren) Klicks selbigen aus dieser Aufmerksamkeit reißen und eine völlig andere aufzwingen. Will ich mit meiner Software den User unterstützen oder (aus reiner Bequemlichkeit, Faulheit, Unwissenheit, Ignoranz) behindern. Da muss jetzt jeder selber entscheiden wo er da stehen möchte. Ich habe meinen Anspruch definiert (manche halten mich für pingelig :mrgreen: ) und prüfe bei jeder Programmierung (die zum User rausgeht) ob ich meinem Anspruch noch gerecht werde. Ergänzend sollte ich noch sagen, dass ich in der glücklichen Lage bin den Zeitrahmen für ein Projekt mitgestalten zu dürfen und die Mitwirkenden (am Zeitrahmen) lieber ein gutes als ein schnelles Release haben möchten. Denn der Anspruch bleibt auf der Strecke wenn die Zeit zu knapp ist. PS War das jetzt schon das Wort zum Sonntag? :mrgreen: |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Hallo,
Zitat:
Ihr seht, damit unterstütze ich meine eigene "Faulheit". Außerdem wird der Arzt im Programm auf die "Gefahr" des Schließen eines Fensters hingewiesen. Allerdings werden hier diese Hinweistexte prinzipiell ignoriert. Zitat:
Liebe Grüße Ines |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
|
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Das hört sich aber nach dem hier an:
![]() Ist eine viel bessere Lösung als Dateihandles einfach so freizugeben. |
AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
Zitat:
Vielleicht möchte der Dottore die Dokumente zweier Krebspatienten vergleichen; wer weiss... siehe Sir Rufo's: Zitat:
Und zum Programmende werden alle temporären Verzeichnisse aus Datenschutzgründen wieder gelöscht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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 by Thomas Breitkreuz