Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Fremdes Programm beenden - Handle anhand Filename ermitteln (https://www.delphipraxis.net/155242-fremdes-programm-beenden-handle-anhand-filename-ermitteln.html)

Ines 14. Okt 2010 14:07

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

DeddyH 14. Okt 2010 14:15

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
 
Hast Du diesen Thread schon gelesen?

Sir Rufo 14. Okt 2010 14:23

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.

Luckie 14. Okt 2010 14:30

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
 
Die Liste liefert auch das Handle. damit kann man WM_LOSE an das Fenster senden.

DeddyH 14. Okt 2010 14:31

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
 
Das mit WM_CLOSE (:mrgreen:) wurde auch im verlinkten Thread genannt.

Sir Rufo 14. Okt 2010 14:33

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
 
Zitat:

Zitat von DeddyH (Beitrag 1055770)
Das mit WM_CLOSE (:mrgreen:) wurde auch im verlinkten Thread genannt.

Darum ja der explizite Hinweis auf WM_LOSE :mrgreen:

DeddyH 14. Okt 2010 14:35

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
 
Zitat:

Zitat von Pappa ante portas
Mein Name ist Lose - ich kaufe hier ein.

Aber nun genug OT ;)

Ines 14. Okt 2010 15:41

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

DeddyH 14. Okt 2010 15:45

AW: Fremdes Programm beenden - Handle anhand Filename ermitteln
 
Wie im verlinkten Thread bereits gesagt würde ich die Fenster durchgehen und die Prozesshandles vergleichen: http://www.delphipraxis.net/999827-post2.html

Bummi 14. Okt 2010 16:41

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 03:16 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz