Delphi-PRAXiS

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;

Sascha L 5. Apr 2006 13:11

Re: Java-Programme sanft beenden
 
Sorry, aber:

1.) erstens weiß ich den Namen des Fensters nicht, sondern bekomme das Fenster-Handle über den Dateinamen (s. oben)
2.) funktioniert der Code nicht
3.) Wird Azureus nicht minimiert, wenn es wm_close erhält. Es passiert einfach nichts.

toms 5. Apr 2006 14:39

Re: Java-Programme sanft beenden
 
Zitat:

Zitat von Sascha L
1.) erstens weiß ich den Namen des Fensters nicht, sondern bekomme das Fenster-Handle über den Dateinamen (s. oben)

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.

Warum den nicht ueber Findwindow / EnumWindows ?

Zitat:

2.) funktioniert der Code nicht
Findest es denn mit dem Code das Fenster Handle von 'Azureus'?

Sascha L 5. Apr 2006 16:07

Re: Java-Programme sanft beenden
 
Mach ich doch mit EnumWindows, s. Funktion oben.

Ich habe versucht das Handle, was ich über die oben genannte Funktion erhalten habe, mit deinem Code zu schließen.

Anders kann ich es nicht machen, da ich NUR den Dateinamen weiß.Ich weiß nicht wie die Fenster heißen, denn das ganze soll jetzt nicht nur für Azureus sein, sondern für alle Java-Programme nutzbar sein.

C.Schoch 5. Apr 2006 17:57

Re: Java-Programme sanft beenden
 
IMHO muss man um Java Programme zu beenden den Prozess "javaw.exe" beenden.
Bin mir aber nicht mehr ganz sicher.

Sascha L 5. Apr 2006 17:59

Re: Java-Programme sanft beenden
 
würden dann aber nicht alle Java-Programme, die geöffnet sind, beendet werden?

Christian Seehase 5. Apr 2006 18:12

Re: Java-Programme sanft beenden
 
Moin Sascha,

probier's doch einfach mal aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 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