Hallo,
ich muss eine JAVA Applikation installieren (FreeMind), dazu darf aber FreeMind nicht gestartet sein. Es muss also vor der Installation geprüft werden, ob die Anwendung noch läuft und dann eine Meldung generiert werden diese durch den Anwender zu schließen.
Das Problem ist jetzt, dass man im Taskmanager keine FreeMind.exe findet, sondern nur JAVAW.EXE. Diese EXE kann aber auch durch eine weitere JAVA Applikation gestartet worden sein, d. h. es kann mehrere gestartete JAVAW.EXE geben.
Mit Hilfe des ProcessExplorer von Sysinternals kann man die Parameter sehen. Für FreeMind steht da z. B.:
"C:\Program Files\Java\jre6\bin\javaw.exe" -jar "C:\Program Files\FreeMind\lib\freemind.jar"
Mit Hilfe von
[autoit]$pid = WinGetProcess("[CLASS:SunAwtFrame]")
[/autoit]
bekomme ich die PID von einem JAVA Prozess, aber nicht von Allen und auch sonst keine Infos.
Mit Hilfe von
[autoit]
$list = ProcessList("javaw.exe")
for $i = 1 to $list[0][0]
MsgBox(0,"PIDs", $list[$i][1] & " " & $list[$i][0])
next
kann ich mir die Prozesse mit ihren PIDs anschauen, erhalte aber auch weiter keine Infos.
Mit Hilfe von
[autoit]
WinGetTitle("[CLASS:SunAwtFrame]")
erhalte ich den kompletten Titeltext einer JAVA Anwendung, jedoch immer nur den Ersten (oder Letzten?) gestarteten... nicht aber Alle.
Der folgende Code findet Freemind, allerdings so oft, wie die Schleife durchlaufen wird. (Anzahl von gestarteten JAVAW.EXE) und nicht nur so oft, wie Freemind gestartet wurde...
[autoit]$list = ProcessList("javaw.exe") ; Get the number and a list of JAVA processes
for $i = 1 to $list[0][0]
$code = StringInStr(WinGetTitle("[CLASS:SunAwtFrame]"), "Freemind")
if $code <> 0 Then ; check if window title of the process contain the searched JAVA application
MsgBox(0, "freemind", WinGetTitle("[CLASS:SunAwtFrame]") & " is in use")
EndIf
Next
Mit Hilfe von WinList kann ich mir alle geöffneten Fenster mit Freemind-Inhalt anzeigen lassen (also auch eine Textdatei mit dem Titel Freemind...):
[autoit]$hwnd = WinList()
For $i = 1 to $hwnd[0][0]
If StringInStr($hwnd[$i][0], "Freemind") > 0 Then
MsgBox(0, "Titel", $hwnd[$i][0])
EndIf
Next
Es gelingt mir jedoch nicht, den Bezug über den Titel zur korrekten PID herzustellen, oder ich finde nur die richtige Funktion nicht...
Während des Schreibens habe ich einen Workaround geschrieben...
Die folgenden Zeilen scheinen zu funktionieren, doch wäre es mir lieber, ich könnte auf irgendeine Art und Weise die Paramter von JAVAW.EXE ebenso auslesen, wie es der ProcessExplorer macht. Vielleicht habt ihr ja noch eine Idee...:
[autoit]$s_DisplayName = "FreeMind"
[/autoit][autoit][/autoit][autoit]; List just javaw.exe processes
$list = ProcessList("javaw.exe")
for $i = 1 to $list[0][0]
$pid = WinGetProcess("[CLASS:SunAwtFrame]")
MsgBox(4096, "PIDs", "PID von WinGetProcess ist: " & $pid & @CRLF & "PID von ProcessList ist: " & $list[$i][1])
if $pid == $list[$i][1] Then
While 1
if StringInStr(WinGetTitle("[CLASS:SunAwtFrame]"), "FreeMind") Then
MsgBox(4096, "freemind", "[CLASS:SunAwtFrame]" & " zugeh. PID: " & $pid)
$response = MsgBox(32 + 4096, "Accept please...", $s_DisplayName & " is in use." & @CRLF & "Please close " & $s_DisplayName & " and click on OK to continue installation.")
Select
Case $response = 1
MsgBox(0,"msg","User select to check again.")
Case Else
MsgBox(0,"msg","Response is not managed.")
Exit 1000
EndSelect
Else
MsgBox(0,"msg","Application is not longer running.")
ExitLoop
EndIf
WEnd
EndIf
Next
(AutoIT 3.3.6.0, Windows Vista 32, Windows XP 32)
mfg
Axel