Prozess der von anderem Prozess gestartet wurde beenden? (Windows Bildschirmtastatur)

Soahc

Aktives Mitglied
Hallo,

ich habe mir eine kleine Methode geschrieben, die mir unter Windows die Bildschirmtastatur starten soll. Ist der Prozess schon gestartet, soll der Prozess beendet werden.

Java:
	private Process systemKeyBoardProzess;
	private void showSystemKeyBoard(){
		try {
			if(systemKeyBoardProzess!=null){
				try{
					systemKeyBoardProzess.exitValue();
				}catch(IllegalThreadStateException e){
					System.out.println("beenden");
					systemKeyBoardProzess.destroy();
					systemKeyBoardProzess = null;
					return;
				}
			}
			
			String sysroot = System.getenv("SystemRoot");
			ProcessBuilder builder = new ProcessBuilder(new String[] {"cmd.exe", "/C", sysroot + "//system32//osk.exe"});
			systemKeyBoardProzess = builder.start();
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

Da ich gerade unter Windows 7 entwickle und sich die exe der Bildschirmtastatur im per UAC geschützten Verzeichniss "Windows\system32" befindet, kann ich sie nur über den Umweg der Commandline (cmd.exe) starten.:

Java:
ProcessBuilder builder = new ProcessBuilder(new String[] {"cmd.exe", "/C", sysroot + "//system32//osk.exe"});
systemKeyBoardProzess = builder.start();

Wie ich der API-Doku entnehme, kann ich mit

Java:
systemKeyBoardProzess.destroy();

den Prozess wieder beenden, nur handelt es sich dabei leider um den Commandline-Prozess und nicht den vom ihm aus gestarteten Bildschirmtastatur-Prozess. Ich habs jetzt schon mit "taskkill /im osk.exe" über den Commandline-Prozess probiert, aber da fehlen dann wieder die Rechte.

Hat vielleicht schon jemand ein Problem dieser Art lösen können?

vielen Dank,

Soahc
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Beenden geht am Besten über Interprozesskommunikation (ich weiss nicht ob das in deinem Fall möglich ist, aber ich glaube nicht) schicke dem anderen Prozess eine Meldung "Bitte beende dich" (bitte nicht wörtlich nehmen, es muss kein String sein) worauf der das dann auch tut.

Aber so wie ich dich verstehe, ist das andere etwas, was nicht du geschrieben hast?

Jede andere Lösung ist Betriebssystemabhängig - was in deinem Fall ja zu reichen scheint
 
Zuletzt bearbeitet:

Soahc

Aktives Mitglied
Das Problem ist, dass ich ja keine direkte verbindung zu dem osk-prozess habe. Daher kann ich ihm auch nicht so ohne weiteres Mitteilen, dass er beendet werden soll. Nach ein wenig rumgebastel habe ich nun doch noch eine Lösung gefunden -> mit tskill. Ist sicher nicht die eleganteste und funktioniert natürlich nur unter Windows, aber sie funktioniert schon mal:

Java:
    private Process systemKeyBoardProzess;
	
    private void showSystemKeyBoard() throws IOException, InterruptedException {
		if(System.getProperty("os.name").toLowerCase().indexOf("windows")==-1){
			return;
		}
		if (systemKeyBoardProzess != null) {
			try {
				systemKeyBoardProzess.exitValue();
			} catch (IllegalThreadStateException e) {
				System.out.println("beenden");
				Process closeProcess = new ProcessBuilder(new String[] {"cmd.exe", "/C", "tskill osk" }).start();
				closeProcess.waitFor();
				closeProcess.destroy();
				systemKeyBoardProzess.destroy();
				systemKeyBoardProzess = null;
				return;
			}
		}

		ProcessBuilder builder = new ProcessBuilder(new String[] { "cmd.exe","/C", "osk.exe" });
		systemKeyBoardProzess = builder.start();
	}

gruß, Soahc
 

Andi_CH

Top Contributor
unter Linux ist es "kill -9 name"

Wenn nur der String[] BS-abhängig ist, ist es defintiv kein Problem - der könnte ja aus einer Umgebungsvariablen, Systemporpertie, einer config Datei oder sonstwoher gelesen werden ....
 

muckelzwerg

Bekanntes Mitglied
Ist doch alles in Ordnung. tskill bzw. taskkill ist doch extra dafür gemacht.
Microsoft Corporation
Du kannst sowieso nichts anderes machen, als das was in taskkill passiert.
WM_CLOSE an alle Fenster, warten und hoffen, dann wieder TerminateProcess() wenn der Prozess nicht aufgibt, das dann von java aus ...
und alles nur um die Funktionalität zu bekommen, die vom BS mitgeliefert wird.
TerminateProcess Function (Windows)

Oder brauchst Du es für ein Windows wo es kein passendes Tool gibt?
Dann findest Du im Netz genug Anleitungen, wie Du das WM_CLOSE aus z.B. C++ senden kannst. Dann musst Du den "taskkill" leider selbst bauen.
(c++ - using sendmessage to send wm_close to another process - Stack Overflow
How To Terminate an Application "Cleanly" in Win32
Processes: How can I kill a process? - CodeGuru Forums
...)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Wert an laufenden Java-Prozess übergeben Allgemeine Java-Themen 10
J Warten bis cmd Prozess fertig ist Allgemeine Java-Themen 2
L Prozess automatisch beenden Allgemeine Java-Themen 8
R PIPE Kommunikation mit Prozess blockiert Allgemeine Java-Themen 0
L Java Web Start - generierter Prozess Allgemeine Java-Themen 4
Tom299 Beliebiges Windows-Programm / Prozess in den Vordergrund bringen Allgemeine Java-Themen 4
A Linux: Native Library mit Rootrechten ohne Prozess mit sudo zu starten Allgemeine Java-Themen 1
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
Thallius Neuen Prozess starten, der auch nach Beedingung des Starter-Prozesses weiterläuft? Allgemeine Java-Themen 5
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
D Grafisches Frontend zu einem Java Prozess erstellen Allgemeine Java-Themen 0
D neuen Prozess starten und anwendung beenden. Allgemeine Java-Themen 3
L Java Prozess 100% -> Analyse Allgemeine Java-Themen 2
P Scanner als Inputstream für Java Prozess Allgemeine Java-Themen 4
J Aktuellen Prozess herausfinden. Allgemeine Java-Themen 3
GUI-Programmer Prozess eine Bezeichnung geben Allgemeine Java-Themen 3
M Einen Prozess "crashen" lassen Allgemeine Java-Themen 9
I %AppData% Variable für einen Prozess setzen Allgemeine Java-Themen 23
E externen Prozess schließen, wenn Programm geschlossen wird Allgemeine Java-Themen 2
Nicer Prozess über Prozessnamen beenden Allgemeine Java-Themen 15
K Prozess starten, überwachen und beenden Allgemeine Java-Themen 4
O Wie laufenden Prozess einfangen? Allgemeine Java-Themen 7
X Prozess-Objekt nach Ausführung der destroy-Methode null oder nicht null ? Allgemeine Java-Themen 10
D Shell-Prozess lässt Thread nicht enden Allgemeine Java-Themen 4
0din Prozess einer .jar umbenennen Allgemeine Java-Themen 7
data89 Java als Boot-Prozess/Daemon? Allgemeine Java-Themen 6
reibi Kill eines Java-Prozesses und Stop-Prozess Allgemeine Java-Themen 3
T In der JVM einen weiteren, unabhängigen Prozess starten Allgemeine Java-Themen 11
G Runtime.exec - Prozess "mittendrin" "einfach Allgemeine Java-Themen 4
Y ProcessBuilder, Prozess wird gestartet, aber Anwendung nicht Allgemeine Java-Themen 5
M String an externen Prozess senden/auslesen Allgemeine Java-Themen 25
T Prozess beenden Allgemeine Java-Themen 3
J Zweiter Prozess der alle x Sekunden etwas abfragen soll Allgemeine Java-Themen 2
G Prozess direkt starten beim Start des Appservers Allgemeine Java-Themen 3
G Prozess-Status Allgemeine Java-Themen 8
H Kommunikation mit einem c-Prozess funzt nicht richtig Allgemeine Java-Themen 5
L Zugriff auf anderen Prozess der VM Allgemeine Java-Themen 9
C nur einen Prozess eines Programmes erlauben Allgemeine Java-Themen 8
S was passiert bei diesem filereader prozess Allgemeine Java-Themen 2
A Java Prozess in neuer JVM Allgemeine Java-Themen 8
K Prozess-Visualisierung: Stichwörter gesucht Allgemeine Java-Themen 4
D runtime.exec --> Prozess hängt sich auf Allgemeine Java-Themen 7
S Prozess javaw.exe läuft immer noch, obwohl Programm beendet Allgemeine Java-Themen 6
M Thread als eigenständiger Linux Prozess mit PID Allgemeine Java-Themen 8
clemente Swing Applikation killt kwin Prozess (unter Linux / KDE) Allgemeine Java-Themen 3
M Zweiten Prozess in Java starten! Allgemeine Java-Themen 5
R Kontrolle über Externe Prozess Allgemeine Java-Themen 5
G Prozess beenden, wenn er hängt Allgemeine Java-Themen 9
S Wie eine Anwendung als neuer Prozess starten? Allgemeine Java-Themen 8
P wie beende ich einen prozess? Allgemeine Java-Themen 3
S blockierenden Prozess stoppen Allgemeine Java-Themen 13
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
C Datentypen Enum-Werte Bestanteil von anderem Enum Allgemeine Java-Themen 8
C Umgebungsvariable Java-Datei in anderem Verzeichnis ausführen Allgemeine Java-Themen 2
J Anderem Thread Variable mitgeben Allgemeine Java-Themen 2
A Nach Benutzerwechsel mit anderem Account in Windows anmelden Allgemeine Java-Themen 8
T Externes Programm auf anderem Bildschirm starten Allgemeine Java-Themen 3
T Java Programm aus anderem Java Programm starten Allgemeine Java-Themen 13
J Eclipse Java Programm aus anderem Java Programm starten Allgemeine Java-Themen 14
I EDT scheint zu blocken wegen Dateioperation in anderem Thread Allgemeine Java-Themen 9
Z Mit ActionListener in anderem Frame lauschen? Allgemeine Java-Themen 3
M Log4J funktioniert nicht unter anderem Benutzer Allgemeine Java-Themen 5
R GPL code mixen mit anderem Code? Allgemeine Java-Themen 7
V Class Mapping - Klasse unter anderem Namen verfügbar machen Allgemeine Java-Themen 8
S jar-datei auf anderem Rechner nicht ausführbar. Allgemeine Java-Themen 40
S Deserialisieren mit anderem Klassennamen Allgemeine Java-Themen 5
conan2 BufferedReader.readLine() von anderem Thread aus beenden Allgemeine Java-Themen 4
J Einbinden einer protected-Methode aus anderem Package Allgemeine Java-Themen 2
G Java Programm auf anderem Pc ausführen Allgemeine Java-Themen 4
H .java Dateien in anderem Package Allgemeine Java-Themen 8
H jar-file in anderem main programm ausführen Allgemeine Java-Themen 2
G Link zu JCreator oder anderem Tool Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben