Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Java-Programme sanft beenden (https://www.delphipraxis.net/66841-java-programme-sanft-beenden.html)

Sascha L 5. Apr 2006 08:36


Java-Programme sanft beenden
 
Hallo,

ich kann eine Anwendung ja entweder sanft beenden oder killen lassen.

Sanft:
Delphi-Quellcode:
PostMessage(AppHandle, wm_close, 1, 1);
Kill:
Delphi-Quellcode:
AppKiller := TProcList.Create;
AppKiller.KillProc(filename,5000);
Das Problem ist nun, dass bei Java-Anwendungen (Azureus, BlueJ, etc.) nur das killen funktioniert. Ein sanftes Beenden ist nicht möglich. Daher würde ich gerne den Befehl für das sanfte Beenden (d.h. dass z.B. Speicher-Dialoge, etc. noch erscheinen) bei Java-Applikationen wissen. Kennt da jemand den Code für?

Gruß
Sascha

Chewie 5. Apr 2006 10:22

Re: Java-Programme sanft beenden
 
Auch Java-Programme fordern vom Betriebssystem mindestens ein Fenster an (bei SWT sind alle Controls nativ). Du brauchst das Handle des Hauptfensters (Hier im Forum suchenFindWindow) und schickst z.B. WM_CLOSE an das Fenster.

Sascha L 5. Apr 2006 11:27

Re: Java-Programme sanft beenden
 
Das klappt aber nicht, wie ich schon beschrieben habe.

Ich ermittle ja das Fenster-Handle, aber nicht über FindWindow sondern über die Exe-Datei, da ich nur den Dateinamen habe und nicht weiß, wie das Fenster heißt. D.h. ich geh alle Prozesse/Fenster durch und gucke, welches zu der EXE gehört, die ich angegeben habe. Das klappt halt auch mit allen Programmen, nur nicht mit Programmen, die mit JAVA programmiert wurden.

Chewie 5. Apr 2006 11:54

Re: Java-Programme sanft beenden
 
Kuck dir mal mit Programmen wie X-Spy oder Spy++ die Fenster an, die das Programm erzeugt. So kommst du zum einen an den Fensternamen und zum anderen siehst du, welche Fenster das Programm besitzt.
Ich schätze mal, du hast das falsche Fenster erwischt, denn ich kann mir nicht vorstellen, warum ein WM_CLOSE nicht funktionieren sollte (Java hin oder her).

Sascha L 5. Apr 2006 12:33

Re: Java-Programme sanft beenden
 
Es gibt nur ein Fensterhandle und genau das findet er auch, aber ich habe mehrere Java-Programme getestet, und es lässt sich nicht mit dem oben genannten Befehl schließen!

Chewie 5. Apr 2006 12:39

Re: Java-Programme sanft beenden
 
Hm, tut mir leid, dann weiß ich auch nicht weiter.

Aber wenn ich Azureus starte und dann das entsprechende Fenster in der Liste der Tasks beende, so wird das Programm beendet. ich dachte bisher aber immer, der Taskmanager sendet dann ein WM_CLOSE, was er wohl aber nicht tut.

Luckie 5. Apr 2006 12:45

Re: Java-Programme sanft beenden
 
Der Taskmanager macht dies in zwei schritten: Erst wird versucht das Programm sanft zu beenden, in dem ein WM_CLOSE an das Hauptfenster geschickt wird. Funktioniert das nicht, wird der Prozess mit MSDN-Library durchsuchenTerminateProcess beendet.

@Sascha: Auch wenn der Fenstertitel nichjt eindeutig ist, die Fensterklasse sollte es sein. Und mit MSDN-Library durchsuchenFindWindow kann man auch ein Fenster nur über die Fensterklasse finden.

Chewie 5. Apr 2006 12:50

Re: Java-Programme sanft beenden
 
Ja, kann ich bestätigen, Luckie. Azureus zeigt auch nach einem "sanften" Beenden über den Taskmanager beim Starten die Meldung, dass das Programme das letzte Mal nicht ordnungsgemäß beendet wurde.

Sascha L 5. Apr 2006 12:52

Re: Java-Programme sanft beenden
 
ja und wie verwende ich das dann mit folgendem code?

Delphi-Quellcode:
function GetWindowHandleByExeName(const AExeName: string): THandle;
var
  SnapShot: THandle;
  p: TProcessEntry32;
  ProcessHandle: THandle;
begin
  Result := 0;
  WindowHandle := 0;
  ProcessHandle := 0;
  p.dwSize := SizeOf(p);
  SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    if Process32First(SnapShot, p) then
      repeat
      if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then
        ProcessHandle := p.th32ProcessID;
      until (ProcessHandle <> 0) or not Process32Next(SnapShot, p);
    EnumWindows(@MyEnumWindowProc, ProcessHandle);
    Result := WindowHandle;
  finally
    CloseHandle(SnapShot);
  end;
end;
Aber wie du ja selbst schon sagst, killt der Taskmanager bei bedarf auch das Programm, wenn ein sanftes Beenden nicht geklappt hat. Und genau das liegt hier ja vor. Selbst der Taskmanager muss Java-Programme killen, weil ein normales wm_close nicht geht.

Daher die Frage, wie kann ich ein Java-Programm sanft beenden? :(

toms 5. Apr 2006 13:05

Re: Java-Programme sanft beenden
 
Azureus minimiert die Anwendung ins Tray, wenn Sie die Nachricht WM_CLOSE erhält.

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('SWT_Window0','Azureus');
  if wnd <> 0 then
  begin
    SendMessage(wnd, WM_CLOSE, 0, 0);
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 Uhr.
Seite 1 von 2  1 2      

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