Externe Anwendung beenden

Diskutiere Externe Anwendung beenden im Allgemeine Java-Themen Bereich.
OSchriever

OSchriever

Hi,
ich brauche eine Lösung um mit Java eine externe Anwendung zu schließen. D.h. ich möchte von meinem Programm aus ein anderes Programm beenden, als wenn man auf das Schließen-Kreuz klicken würde. Wichtig: Das Programm darf nicht abgebrochen werden(über Taskmanager geschlossen werden).
Kann mir da jemand weiterhelfen?

Zur Info: Ich muss auf die Datenbank eines Programms zugreifen, das funktioniert nur wenn das Programm aus ist und das möchte ich gerne automatisieren, da die Kunden ständig das Programm geöffnet lassen und dann die Kopplung nicht funktioniert...

Vielen Dank
 
Wurstkopp

Wurstkopp

Das Windows "taskkill" Programm über Runtime.getRuntime().exec ausführen.

EDIT: Mit "über Kreuz beenden" meinst du, dass beim regulären Beenden des Programmes noch was passiert, welches beim harten Abbruch nicht passiert?
 
OSchriever

OSchriever

Hi,
beim regulären beenden wird wahrscheinlich gespeichert(denke ich). Beim normalen beenden gibt es keine Probleme mit der Kopplung. Ich hatte schon ein Programm laufen, welches im Hintergrund läuft und das Programm zeitgesteuert "killt", das führt zu Problemen in der Datenbank, die ich jedes mal wieder reparieren muss. :(
Mit Taskkill wird das Programm doch auch hart abgebrochen?
LG
 
mihe7

mihe7

Probiers mal mit JNA. Folgendes Beispiel sendet an ein Fenster mit dem Titel "Dokument - WordPad" ein WM_CLOSE.

Java:
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class Main {
    public static void main(String[] args) {
        String windowTitle = "Dokument - WordPad";
        WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, windowTitle);
        if (hwnd != null) {
            User32.INSTANCE.PostMessage(hwnd, WinUser.WM_CLOSE, new WinDef.WPARAM(), new WinDef.LPARAM());
        }
    }
}
 
Ullenboom

Ullenboom

Nicht das X, aber ein anderer Weg (für andere Aufgaben), wenn man von Java aus etwas töten möchte:

Wenn man ein externes Programm mit dem ProcessBuilder startet, dann kann man es von Java auch wieder beenden. ProcesssBuilder start() liefert Process, das hat eine destroy() Methode.

Eine andere Lösung wäre die PID und ProcessHandle seit Java 9, hier hat man ebenfalls ein destroy()/destroyForcibly().
 
OSchriever

OSchriever

Wäre es vllt auch möglich
Probiers mal mit JNA. Folgendes Beispiel sendet an ein Fenster mit dem Titel "Dokument - WordPad" ein WM_CLOSE.

Java:
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class Main {
    public static void main(String[] args) {
        String windowTitle = "Dokument - WordPad";
        WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, windowTitle);
        if (hwnd != null) {
            User32.INSTANCE.PostMessage(hwnd, WinUser.WM_CLOSE, new WinDef.WPARAM(), new WinDef.LPARAM());
        }
    }
}
Danke, probiere das gleich mal aus... :)
 
OSchriever

OSchriever

Nicht das X, aber ein anderer Weg (für andere Aufgaben), wenn man von Java aus etwas töten möchte:

Wenn man ein externes Programm mit dem ProcessBuilder startet, dann kann man es von Java auch wieder beenden. ProcesssBuilder start() liefert Process, das hat eine destroy() Methode.

Eine andere Lösung wäre die PID und ProcessHandle seit Java 9, hier hat man ebenfalls ein destroy()/destroyForcibly().
Ist der weg mit der PID und ProcessHandle auch in der Insel(Edition 11) nachzulesen? Da muss ich das Externe Programm aber auch selbst gestartet haben oder?
 
Ullenboom

Ullenboom

Wenn man in Java die PID hat, kann man alles töten, probier's aus :)

ProcessHandle.allProcesses().forEach( ProcessHandle::destroy );

Das ist Teil der 2. Insel, das Update dauert aber noch.
 
OSchriever

OSchriever

Vielen Dank, ich werde jetzt mal etwas herumprobieren.
Melde mich bei (Miss)erfolg. :)
 
OSchriever

OSchriever

Probiers mal mit JNA. Folgendes Beispiel sendet an ein Fenster mit dem Titel "Dokument - WordPad" ein WM_CLOSE.

Java:
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class Main {
    public static void main(String[] args) {
        String windowTitle = "Dokument - WordPad";
        WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, windowTitle);
        if (hwnd != null) {
            User32.INSTANCE.PostMessage(hwnd, WinUser.WM_CLOSE, new WinDef.WPARAM(), new WinDef.LPARAM());
        }
    }
}
Das funktioniert bei mir nicht, hast du das getestet?
LG
 
OSchriever

OSchriever

Das hat gepasst. Habe den Code so übernommen und WordPad geöffnet.
Hier die Exception:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/platform/win32/User32
at de.schrieverkommt.Main.main(Main.java:11)
Caused by: java.lang.ClassNotFoundException: com.sun.jna.platform.win32.User32
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 1 more

Ich habe jna 5.5.0
 
mihe7

mihe7

Ja, ich habe zwei Abhängigkeiten:
Code:
net.java.dev.jna:jna:5.5.0
net.java.dev.jna:jna-platform:5.5.0
Bin aber mit Java 1.8 unterwegs.
 
OSchriever

OSchriever

Die habe ich auch beide, arbeite mit Java 9. Stehe jetzt etwas auf dem Schlauch damit...
 
OSchriever

OSchriever

Ok, es klappt beim WordPad und z.B. bei Word auch, aber wenn ich jetzt den TeamViewer schließen möchte, dann klappt es nicht. Warum? :(
 
OSchriever

OSchriever

Wenn man in Java die PID hat, kann man alles töten, probier's aus :)

ProcessHandle.allProcesses().forEach( ProcessHandle::destroy );

Das ist Teil der 2. Insel, das Update dauert aber noch.
Hast du zufällig ein Beispiel für mich? Ich kenne mich mit ProcessHandle leider kein Stück aus...
 
Wurstkopp

Wurstkopp

Öhm.. Ist Teamviewer nicht als Dienst installiert und kannst ihn entsprechend darüber offiziell beenden? z.B. net stop
 
Thema: 

Externe Anwendung beenden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben