Ausgeführtes Programm per PID aktivieren

  • VBScript

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Ausgeführtes Programm per PID aktivieren

    Hallo zusammen,

    ich versuche schon seit einiger Zeit ein kleines VBScript (*.vbs) zu erstellen, bekomme es aber leider nicht ans laufen... :(

    Das Script soll von einem bereits ausgeführten Programm (z.B. progA.exe) die aktuelle ProzessID auslesen.

    Und hier hapert es dann schon... ?( Ich bekomme es einfach nicht hin die PID herauszufinden. Dieses sollte mit Process.GetProcessesByName("progA") funktionieren. Ich bekomme aber einen Fehler das die Variable Process nicht deklariert ist, bzw. das eine Anweisung fehlt.

    Mit Hilfe der PID soll dann das Fenster von ProgA aktiviert werden, um dann mit Sendkeys die Taste F9 zu senden.


    Ich hoffe ihr könnt mir helfen.

    Hier einmal der Code:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim WshShell
    3. Dim TestProcess() As Process
    4. Dim Pid
    5. Const PROGRAMM = "C:\Pfad...\ProgA.exe"
    6. Set WshShell = CreateObject("WScript.Shell")
    7. PID = TestProcess.GetProcessesByName("ProgA")
    8. WScript.sleep 1000
    9. WshShell.AppActivate(Pid)
    10. WScript.sleep 1000
    11. WshShell.SendKeys "{F9}" 'Taste senden
    12. WScript.sleep 1000
    13. msgbox "ProzessID = " & PID
    14. WScript.Sleep 1000


    Edit by LaMa5:
    - *moved* (Allgemeines --> VB Script)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMa5“ ()

    Hallo zusammen,

    ich habe selber noch ein wenig probiert, und bin dabei auf folgenden Lösungsansatz gestoßen.


    strComputer = "."
    Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = 'progA.exe'")
    For Each objProcess in colProcessList
    msgbox objProcess.ProcessId
    Next


    Wie kann ich denn hierbei die Schleife entfernen, so das die ProzessId nur einmal ausgegeben wird?

    Danke im Voraus!

    Mfg
    Zero
    Wenn mehrere ProzessIDs gefunden werden, dann musst Du ja noch herausfinden, an welche die F9 gesendet werden soll. Evtl. durch getparent oder so. Wird nur eine gefunden, dann wird die "Schleife" auch nur einmal ausgeführt. Wenn bei mehreren Treffern die Taste F9 für die anderen nicht gefährlich wird, dann einfach die F9 senden.

    Leider wird immer viel geheim gehalten. In diesem Fall "ProgA". Möglich, dass sich das Programm auch per DDE oder sonstwie steuern lässt...

    Um es nur einmal zu senden, sollte ein exit for nach dem ersten Senden reichen.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    @perterfido: Danke für die Unterstützung. :thumbsup:

    Das Programm wird für eine Aufgabenübernahme genutzt. Die Aufgabe kann über F9 und ENTER beendet werden. Dieses soll automatisch nach einer Zeit geschehen. Ein mehrfaches Ausführen des Programmes scheint nicht möglich zu sein, da wenn ich es manuell ein zweites mal starte kein neuer Task im Task-Manager erscheint.

    Folgendes Script habe ich programmiert. Hier möchte ich nun dass die For-Schleife verlassen wird, wenn ein Prozess gefunden wurde. Ist kein Prozess vorhanden soll das Script verlassen werden. Die If-Abfrage in der For-Schleife funktioniert aber nicht. :S Kann mir jemand sagen wie die Prüfung aussehen muss?

    Visual Basic-Quellcode

    1. strComputer = "."
    2. Set objWMIService = GetObject _
    3. ("winmgmts:\" & strComputer & "\root\cimv2")
    4. Set colProcessList = objWMIService.ExecQuery _
    5. ("Select * from Win32_Process Where Name = 'progA.exe'")
    6. For Each objProcess in colProcessList
    7. progAID = objProcess.ProcessId
    8. if proAID > 0 Then 'Hier soll abgefragt werden ob ein Prozess existiert
    9. Exit For
    10. End if
    11. msgbox "progA nicht gestartet"
    12. WScript.Quit
    13. Next
    14. set WshShell = WScript.CreateObject("WScript.Shell")
    15. WScript.Sleep 1000 '1 Sekunde warten
    16. WshShell.AppActivate(progAID) 'Fenster aktivieren
    17. WScript.Sleep 1000 '1 Sekunde warten
    18. WshShell.SendKeys "{F9}" 'Taste F9 senden
    19. WScript.Sleep 5000 '5 Sekunde warten
    20. WshShell.SendKeys "{ENTER}" 'Taste Enter senden
    21. WScript.Sleep 1000
    22. msgbox progAID
    Du vergleichst ProID mit ProgID.

    Das sollte gehen:

    Visual Basic-Quellcode

    1. option explicit
    2. dim objWMIService, colProcessList, objProcess, WshShell, strComputer, PId
    3. const Programm = "'programmname.exe'"
    4. const Taste = "{F9}"
    5. PId = 0
    6. strComputer = "."
    7. Set objWMIService = GetObject ("winmgmts:\" & strComputer & "\root\cimv2")
    8. Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = " & Programm)
    9. if colProcessList.Count > 0 then
    10. For Each objProcess in colProcessList
    11. PId = objProcess.ProcessId
    12. exit for
    13. Next
    14. else
    15. msgbox Programm & " nicht gestartet" , vbokonly + vbcritical, "Programm nicht gefunden"
    16. end if
    17. if PId <> 0 then
    18. set WshShell = WScript.CreateObject("WScript.Shell")
    19. WScript.Sleep 1000 '1 Sekunde warten
    20. WshShell.AppActivate(PId) 'Fenster aktivieren
    21. WScript.Sleep 1000 '1 Sekunde warten
    22. WshShell.SendKeys Taste 'Taste F9 senden
    23. WScript.Sleep 5000 '5 Sekunde warten
    24. WshShell.SendKeys "{ENTER}" 'Taste Enter senden
    25. WScript.Sleep 1000
    26. end if


    Wobei durch die langen Pausen die Gefahr besteht, dass der User (oder das System) in der Zwischenzeit ein anderen Programm wieder in den Vordergrund geholt hat. Die Pausen verkürzen oder statt Sendkeys mittels API Sendmessage direkt die Tasten zu dem Fensterhandle senden. Dazu musst du dann einmal "F9 gedrückt" und einmal "F9 losgelassen" senden.
    Gruß
    Peterfido

    Keine Unterstützung per PN!