![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:41 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