Ich habe eine Frage zu Windows-Scripting Host WSH und Python.
Ich möchte mit der WSH ein externes Programm (Konsolenanwendung) starten (Ablauf automatisieren) und benötige dabei die Prozess-Id dieses Externen Programms. Das Programm liest binäre Daten aus einer Datei und erstellt ein Textfile, was einige Zeit dauert. Dabei läuft die Ausgabe des Programms in einem Windows-Konsolenfenster ab. Ungünstigerweise muss man zum Abschluss des Programms die Enter-Taste drücken. Änderungen an diesem Programm kann ich nicht machen, da der Quelltext nicht (mehr) verfügbar ist.
Ich kann zwar mit Sendkeys eine Tasteneingabe senden, doch kann ich nicht immer sicher stellen, dass diese Konsole gerade den Fokus hat.
Noch problematischer ist es, wenn das Programm im Hintergrund läuft (z.B. wenn der Benutzer abgemeldet ist). Da kann ich den Fokus nicht auf diese Konsole setzen. Hier ein Beispiel:
Code: Alles auswählen
import win32api
import win32com.client
import win32gui
import win32process
shell = win32com.client.Dispatch("WScript.Shell")
shell.Run('eineSpezielleExe.exe')
win32api.Sleep(1000)
hwnd2 = win32gui.GetForegroundWindow()
_, pid2 = win32process.GetWindowThreadProcessId(hwnd2)
print(hwnd2)
print(pid2)
win32api.Sleep(10000)
shell.AppActivate(pid2)
win32api.Sleep(1000)
shell.SendKeys("{ENTER}")
Nun meine Frage: Gibt es eine Möglichkeit, die Prozess-Id auch ohne der Funktion GetWindowThreadProcessId(hwnd) zu ermitteln? Also z.B. als Rückgabewert von shell.Run('eineSpezielleExe.exe')?
Wie kann man einen Prozess mit einer bestimmten PId killen? So könnte ich ohne Sendkeys auskommen, da die gewünschte Textdatei schon vor dem Zeitpunkt der Benutzereingabe (Enter) fertig gestellt ist. Ich müsste demzufolge nur überprüfen, ob die Datei schon vollständig ist und könnte so das Fenster schließen.
Matthias