1 Prozess mehrere Fenster, alle Titel finden

  • Servus

    Ich habe ein Programm(Prozess.exe), das mehrere Fenster hat
    Ich würde gerne möglist schnell alle Titel dieser Fenster finden.

    Ich habe das hier gefunden aber das ist langsam und irgendwie spinnt das auch mal.
    Pid bekomme ich über folgendes...

    [autoit]

    $ProcessList = ProcessList('Prozess.exe')

    [/autoit]
    Spoiler anzeigen
    [autoit]


    Func _ProcessGetWindows($PID)
    Local $WList = WinList()
    Local $RArr[1][4]
    If IsString($PID) Then
    Local $PList = ProcessList($PID)
    If Not @error Then $PID = $PList[1][1]
    EndIf
    For $i = 1 To $WList[0][0]
    If WinGetProcess($WList[$i][0]) = $PID Then
    If BitAND(WinGetState($WList[$i][1]), 2) Then
    $RArr[0][0] += 1
    ReDim $RArr[$RArr[0][0] + 1][4]
    $RArr[$RArr[0][0]][0] = $WList[$i][0]
    $RArr[$RArr[0][0]][1] = $WList[$i][1]
    EndIf
    EndIf
    Next
    If $RArr[0][0] = 0 Then Return SetError(1, 1, $RArr)
    Return $RArr
    EndFunc

    [/autoit]


    Danke schon mal für ne kleine Hilfe...

    MFG chris :D

  • Schaue mal in der WinAPIEx.au3 nach diesen Funktionen,

    _WinAPI_EnumProcessWindows
    _WinAPI_EnumChildWindows

    ob sie dir helfen.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • In [ offen ] Win Funktionen auch mit ProzessPid? ist genau die Lösung für dich. _ProcessGetWinEx gibt ein Array mit allen Fenstern zu einer PID zurück:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $aWin = _ProcessGetWinEx(3952)
    _ArrayDisplay($aWin)

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

    Func _ProcessGetWinEx($ivPid, $svClass = "", $svTitle = "", $svText = "", $ivReturnOnlyFirstMatch = False)
    $ivPid = ProcessExists($ivPid)
    If Not $ivPid Then Return (SetError(1, 0, 0))

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

    Local $avwArray = WinList()
    Local $avRet[$avwArray[0][0]] = [0]
    Local $iFound = 0
    For $i = 1 To $avwArray[0][0]
    $avClass = DllCall("User32.dll", "int", "GetClassName", "hwnd", $avwArray[$i][1], "str", "", "int", 4096)
    If WinGetProcess($avwArray[$i][1]) = $ivPid Then
    If $svClass = "" Or (IsArray($avClass) And $avClass[2] = $svClass) Then
    If ($svTitle = "" Or StringInStr($avwArray[$i][0], $svTitle)) And ($svText = "" Or StringInStr(WinGetText($avwArray[$i][1]), $svText)) Then
    $iFound += 1
    $avRet[$iFound] = $avwArray[$i][1]
    If $ivReturnOnlyFirstMatch Then
    $avRet = $avRet[1]
    ExitLoop
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    ReDim $avRet[$iFound + 1]
    $avRet[0]=$iFound
    Return $avRet
    EndFunc ;==>_ProcessGetWinEx

    [/autoit]

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (13. Februar 2013 um 23:12)

  • Du kannst dir die PID auch viel einfacher über

    [autoit]

    @AutoItPID

    [/autoit]


    holen

    Niemand hat gesagt das chrisatack die Fenstertitel seines eigenen Scripts braucht.
    Selbst wenn, wäre diese Lösung relativ unklug da man ja eigentlich die Namen seiner Fenster selbst bestimmt oder in Varriablen gespeichert hat.
    Natürlich ist es MÖGLICH aber ich persönlich bin immer ein Fan von der sichersten Varriante mit den wenigsten Fehlerquellen und die ist eben über die selbst vergebenen Titel.

    Grüße ErrorKid

  • @ErrorKid : ja , da hab ich falsch gelesen
    Dann solltest du aber mit den Handles arbeiten.
    Was ist, wenn ein anderes Programm zufällig den gleichen Titel wie deine Programme haben