zwischen Programmen via "abbildpfadname" wechseln

  • Hallöschen!
    Ich komm mal direkt zu meinem Problem:
    Es ist ja möglich zwischen Anwendungen hin und her switchen zu lassen! Aber wie kann ich das via Abbildpfadname (so wirds im Taskmanager deklariert) machen?
    PID kann ich leider nicht verwenden, da sich diese ständig ändert!
    Abbildname kann ich auch nicht verwenden da ich zwischen 2 gleichen Anwendungen switchen möchte und dieser bei beiden identisch ist!
    Ledeglich der Pfad zu den Anwendungen ist anders und würde mir die Möglichkeit geben damit zu switchen.

    Muß dazu sagen bin noch Neuling bei dem ganzen und bitte darum, sofern es möglich ist und nicht zuviele umstände macht, Erläuterungen zu den Codes hinzuzufügen.

    MFG Blacky666

  • Hi,
    Also wenn ich es nicht falsch verstehe willst du zwischen zwei Programmen/Fenstern wechseln? Also Minimieren und Maximieren?
    das würde ich mit

    [autoit]

    WinActivate

    [/autoit]


    lösen.
    Ansonsten einfach mal in der Hilfe "Win" eingeben. Da gibts ne Menge Befehle.
    Jakolo

  • das mit WinActivate hatte ich mir schon gedacht!
    Aber zum beisspiel dieser Code hier:

    [autoit]

    WinActivate("[CLASS:Notepad]", "")

    [/autoit]


    Da wird ja im Prinzip geschaut nach dem "Abbildname" und dann in den Vordergrund gebracht.
    Die Funktion stimmt ja auch zu 90%.
    Hier mal ein Beispiel:
    Testprogramm.exe befindet sich einmal auf Pfad D:/Test/Testprogramm und in E:/Test2/Testprogramm.exe

    Im Taskmanager würde dann drin stehn (wenn beide gestartet sind):


    Abbildname - PID - Benutzer - CPU - Arbeitsspeicher - Abbildpfadname
    Testprogramm.exe - 1234 - User - 15 - 50.000k - D:/Test/Testprogramm.exe
    Testprogramm.exe - 5789 - User - 50 - 51.000k - E:/Test2/Testprogramm.exe

    So, mit dem Befehl WinActivate würde ich theoretisch eines dieser Progs öffnen, aber ich könnte nicht spezifisch sagen öffne das Programm Testprogramm.exe, das sich unter Pfad D:/Test/ befindet und ständig auch hin und her-switchen. einen Titel hat das Programm leider nicht somit bleibt mir für ein kontrolliertes switchen nur dieses Abbildpfadname übrig.

    MFG Blacky666

  • Reicht dir folgendes als Ansatz?:

    Spoiler anzeigen
    [autoit]

    $aProcesses = ProcessList()

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aProcesses[0][0]
    MsgBox(0, "", "Prozessname: " & $aProcesses[$i][0] & @CRLF & "Prozesspfad: " & ProcessGetPath($aProcesses[$i][1]))
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Alternative (Langsamer aber findet mehr Pfade):
    #cs
    For $i = 1 To $aProcesses[0][0]
    MsgBox(0, "", "Prozessname: " & $aProcesses[$i][0] & @CRLF & "Prozesspfad: " & GetProcessPath($aProcesses[$i][1]))
    Next
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    Func ProcessGetPath($hPID)
    ;by AspirinJunkie
    If IsString($hPID) Then $hPID = ProcessExists($hPID)
    Local $hKernel = DllOpen("Kernel32.dll")
    Local $sPath = DllStructCreate("char[1000]")
    Local $hProcess = DllCall($hKernel, "int", "OpenProcess", "dword", 0x0400 + 0x0010, "int", 0, "dword", $hPID)
    DllCall("Psapi.dll", "long", "GetModuleFileNameEx", "long", $hProcess[0], "int", 0, "ptr", DllStructGetPtr($sPath), "long", DllStructGetSize($sPath))
    DllCall($hKernel, "int", "CloseHandle", "hwnd", $hProcess[0])
    DllClose($hKernel)
    Return DllStructGetData($sPath, 1)
    EndFunc ;==>_ProcessGetPath

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func GetProcessPath($hPID)
    Local $oWMI = ObjGet("winmgmts:\\localhost\root\CIMV2")
    For $o In $oWMI.ExecQuery("SELECT ExecutablePath FROM Win32_Process WHERE ProcessID=" & $hPID, "WQL", 48)
    Return $o.ExecutablePath
    Next
    EndFunc

    [/autoit]
  • also hab mir mal den Code so rausgenommen und ausprobiert, allerdings versteh ich ihn leider nicht vollständig ;(

    Kannst du mir das ganze mal bitte so schreiben, dass er zwischen den Programmen einmal hin und her switcht? am besten mit einer MSGBOX dazwischen?

    Ich versteh, das du mit diesem Code alle Prozesse und deren Pfade abrufst und sie dann in einer Variable steckst die du dann mit einer MSGBOX ausgibst aber wie kp!

    vor allem warum Kernel und warum Localhost???

    Sry aber wie ich schon gesagt hatte "bin Anfänger" hab also bitte nachsicht mit mir. Lernen will ich ja ^^

  • Ist ok - deswegen frag ich ja nur ob es dir so reicht.
    Also ehrlich gesagt weiß ich nicht was du mit "switchen" meinst.
    Switchen kann man zwischen Fenstern - du aber willst zwischen Prozessen switchen.
    Um es etwas einfacher zu machen daher mal eine Funktion welche dir die ProzessID des Prozesses anhand des Pfades zurückgibt:

    Spoiler anzeigen
    [autoit]

    Global $Pfad = 'C:\Windows\explorer.exe'

    [/autoit] [autoit][/autoit] [autoit]

    $ProcessID = GetPIDbyPath($Pfad)
    If @error Then
    MsgBox(0,"Fehler", "Konnte keinen Prozess finden.")
    Else
    MsgBox(0,"", "ProzessID: " & $ProcessID)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Gibt ProzessID anhand des Prozesspfades zurück
    Func GetPIDbyPath($sPath)
    Local $oWMI = ObjGet("winmgmts:\\localhost\root\CIMV2")
    For $o In $oWMI.ExecQuery("SELECT * FROM Win32_Process", "WQL", 48)
    If $o.ExecutablePath = $sPath Then Return $o.ProcessID
    Next
    Return SetError(1,0,"")
    EndFunc

    [/autoit]

    Wenn du tatsächlich doch Fenster meinst dann müsste man noch mit WinList alle Fenster durchgehen und jeweils mit WinGetProcess die ID vergleichen um einem Fenster den entsprechenden Prozess zuzuweisen.
    Würde dir es ja ausführlicher hinschreiben aber ich bin gerade bisschen zeitlich begrenzt.

  • ich will schon in dem sinn zwischen den Fenstern hin und her springen, Also z.B. ich habe 2mal Office offen und er soll mir dann erster das erste Office anzeigen und dann das 2te

    [autoit]

    Global $Pfad = 'C:\Windows\explorer.exe'

    [/autoit]


    ok mit dieser Zeile kann ich dann die ProzessID dann anhand des Pfades in eine Variable ($ProcessID) schleiben.

    wie lautet dann der WinActivate-Befehl um das fenster dann anzeigen zu lassen?
    weil in der Hilfe steht ja dies:

    [autoit]

    WinActivate ( "title" [, "text"] )

    [/autoit]


    Aber damit funktioniert es ja nicht, da PID ist ja nicht title b.z.w. Text!

  • Wenn du tatsächlich doch Fenster meinst dann müsste man noch mit WinList alle Fenster durchgehen und jeweils mit WinGetProcess die ID vergleichen um einem Fenster den entsprechenden Prozess zuzuweisen.

    Hast du das wenigstens mal selbst ausprobiert? - weil eine Frage hattest du dazu ja nicht...
    Ich würde dir empfehlen das nochmal selbst zu probieren und nur wenn du wirklich nicht weiterkommst folgendes anzuschauen:

    Spoiler anzeigen
    [autoit]

    Global $Pfad = @WindowsDir & '\notepad.exe'
    Global $ProcessID

    [/autoit] [autoit][/autoit] [autoit]

    $aWins = WinList() ; Schreibe alle existierenden Fenster in das Array $aWins

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $aWins[0][0] ; Durchlaufe das Array

    [/autoit] [autoit][/autoit] [autoit]

    If WinGetProcess( $aWins[$i][1] ) = $ProcessID Then ; Wenn der zugehörige Prozess des Fensters unserem gesuchten entspricht gehe in die Verzweigung
    WinActivate($aWins[$i][1]) ; Aktiviere das derzeitige Fenster der Schleife bei dem die Prozess-ID unsere gesuchte ist
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Gibt ProzessID anhand des Prozesspfades zurück
    Func GetPIDbyPath($sPath)
    Local $oWMI = ObjGet("winmgmts:\\localhost\root\CIMV2")
    For $o In $oWMI.ExecQuery("SELECT * FROM Win32_Process", "WQL", 48)
    If $o.ExecutablePath = $sPath Then Return $o.ProcessID
    Next
    Return SetError(1,0,"")
    EndFunc

    [/autoit]