Verschiedene Punkte aus Array auslesen

  • Folgender Code von pethebee:

    [autoit]

    $list = ProcessList("firefox.exe")
    For $i = 1 To UBound($list) - 1
    $var = ProcessGetWindow($list[$i][0])
    Next
    If $var = "Fenster, wie es nicht heißen soll" Then
    $var = ; soll der nächste Punkt aus dem array genommen werden
    EndIf
    GuiCtrlSetData($input,$var)

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

    Func ProcessGetWindow($PId)
    $PId = ProcessExists($PId)
    If $PId = 0 Then
    SetError(1)
    Else
    Local $WinList = WinList()
    Local $i = 1
    Local $WindowTitle = ""
    While $i <= $WinList[0][0] And $WindowTitle = ""
    If WinGetProcess($WinList[$i][0], "") = $PId Then
    $WindowTitle = $WinList[$i][0]
    Else
    $i += 1
    EndIf
    WEnd
    Return $WindowTitle
    EndIf
    EndFunc ;==>ProcessGetWindow

    [/autoit]

    So, anm Anfang werden halt die Fenster ausgelistet und sofort das este unter Punkt 0 im Array in die inputbox geschrieben. Nur manchmal ist nicht die 0 das gesuchte, sondern die 1. Wie mache ich das jetzt, dass er den Punkt 1 aus dem Array ausliest?

    • Offizieller Beitrag

    Meinst du so?

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    Global $title = ''
    $list = ProcessList("firefox.exe")
    _ArrayDisplay($list)
    For $i = 1 To UBound($list) - 1
    If ProcessGetWindow($list[$i][0]) = $title Then
    ConsoleWrite("habs" & @CRLF)
    ;~ GUICtrlSetData($input, $var)
    EndIf
    Next

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

    Func ProcessGetWindow($PId)
    $PId = ProcessExists($PId)
    If $PId = 0 Then
    SetError(1)
    Else
    Local $WinList = WinList()
    Local $i = 1
    Local $WindowTitle = ""
    While $i <= $WinList[0][0] And $WindowTitle = ""
    If WinGetProcess($WinList[$i][0], "") = $PId Then
    $WindowTitle = $WinList[$i][0]
    Else
    $i += 1
    EndIf
    WEnd
    ConsoleWrite($WindowTitle & @CRLF)
    Return $WindowTitle
    EndIf
    EndFunc ;==>ProcessGetWindow

    [/autoit]

    Mega

  • Dein Script spuckt unter anderem nur den Prozessnamen aus.
    Ich habe dieses Script:

    Spoiler anzeigen
    [autoit]

    $list = ProcessList("sro_client.exe")
    For $i = 1 To UBound($list) - 1
    $var = ProcessGetWindow($list[$i][0])
    Next

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

    Func ProcessGetWindow($PId)
    $PId = ProcessExists($PId)
    If $PId = 0 Then
    SetError(1)
    Else
    Local $WinList = WinList()
    Local $i = 1
    Local $WindowTitle = ""
    While $i <= $WinList[0][0] And $WindowTitle = ""
    If WinGetProcess($WinList[$i][0], "") = $PId Then
    $WindowTitle = $WinList[$i][0]
    Else
    $i += 1
    EndIf
    WEnd
    Return $WindowTitle
    EndIf
    EndFunc ;==>ProcessGetWindow

    [/autoit]


    Ohne, dass durch ArrayDisplay die Namen vn den Fenstern angezeigt werden, sucht er sich das heraus, was unter Row [0] steht.
    Ich zeige es mal an einem Screen:
    [Blockierte Grafik: http://img516.imageshack.us/img516/7518/screenshot0504200814202gd3.png]
    Das, was bei Row [0] steht, also in diesem Falle NetscapeDispatchWnd würde er als Fensternamen nehmen. Aber je nach Programmtyp variiert diese Row[0]. Manchmal, brauche ich stattdessen die Row[1]. Also NetScapeDispatch ist jetzt nicht das, was ich suche, sondern in diesem Fall XPCOM:EventReceiver. Wie mache ich das also, dass er, wenn er bei Row[0] NetScapeDispatch findet, dass er abfragt, was in Row[1] steht?

  • Erstmal das nehmen:

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>

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

    $a = ProcessList('firefox.EXE')

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

    Dim $result[2]

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

    For $prozessloop = 1 To UBound($a) - 1
    $Fenster = ProcessGetWindow($a[$prozessloop][1])
    _ArrayDisplay($Fenster)
    For $fensterloop = 0 To Ubound($Fenster)-1
    If $Fenster[$fensterloop][0] = "XPCOM:EventReceiver" Then ; Hier kommt die Bedingung rein.
    ; kann auch Stringleft = "gg" oder Stringright = "??" oder StringInStr oder so sein :)
    $result[0] = $Fenster[$fensterloop][0]
    $result[1] = $Fenster[$fensterloop][1]
    ExitLoop
    Endif
    Next
    Next

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

    _ArrayDisplay($result,"Found Window, Name + Handle")

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

    Func ProcessGetWindow($PId)
    $PId = ProcessExists($PId)
    If $PId = 0 Then
    SetError(1)
    Else
    Local $WinList = WinList()
    Local $WindowTitle[1][2]
    Local $x = 0
    For $i = 1 To $WinList[0][0]
    If WinGetProcess($WinList[$i][1], "") = $PId And $WinList[$i][0] <> ""Then
    ReDim $WindowTitle[$x+1][2]
    $WindowTitle[$x][0] = $WinList[$i][0]
    $WindowTitle[$x][1] = $WinList[$i][1]
    $x += 1
    EndIf
    Next
    Return $WindowTitle
    EndIf
    EndFunc ;==>ProcessGetWindow

    [/autoit]


    und die Bedingung anpassen :) Aber soll das etwa wieder ein Bot werden? "sro_client.exe"

    Einmal editiert, zuletzt von progandy (5. April 2008 um 20:24)

  • Danke erstmal, das sieht schonmal gut aus, allerdings kommt ein Error bei der Zeile

    [autoit]

    If $Fenster[$fensterloop][0] = "XPCOM:EventReceiver" Then ; Hier kommt die Bedingung rein.

    [/autoit]


    wegen nicht bestimmter Variable, obwohl die doch vorher festgelegt wurden?!

    Und nein, dass wird kein Bot ;)
    Ist nur ein zusätzliches Hilfetool für Silkroad. Je nach Programm was man zum starten des Spiels benutzt, ändert sich der Fenstername. Ist halt immer Row[0], außer bei einer Sache.
    MfG

  • For $fensterloop = 0 To Ubound($Fenster)-1
    Da war der Fehler drin. Habs geändert.

  • Was willst du denn?
    Wi heißen denn die Fenstertitel, die du willst, wie die die du nicht willst usw?

    Ohne Angaben kann ich nicht sagen, was dir fehlt :P

  • Das, was er nicht finden soll, ist unter anderem: "international srobot" oder "Commandline"
    Wenn er das findet, soll er weitersuchen, solange, bis er eins findet, was erwünscht ist
    ;)
    Genauen Fensternamen kann man nicht sagen, da das wirklich bei jedem Spieler abweichen kann.

  • So:

    [autoit]

    If Not Stringinstr($Fenster[$fensterloop][0],"international srobot") And Not Stringinstr($Fenster[$fensterloop][0],"Commandline") THen

    [/autoit]
  • Sorry wenn ich dich so quälen muss, aber ich verstehe nicht mehr viel davon ;(
    Ich verstehe auch nicht, was in die If Abfrage soll, damit der Row[1] abguckt.
    Also:
    Das soll er machen:
    Er speichert Row[0] in eine Variable, was ja hiermit gemacht wird:

    [autoit]

    $list = ProcessList("sro_client.exe")
    For $i = 1 To UBound($list) - 1
    $var = ProcessGetWindow($list[$i][0])
    Next

    [/autoit]


    Wenn aber die Variable ($var) nicht international srobot oder Commandline heißt, kann er beenden. Wenn sie aber einen der beiden Namen hat,
    soll er Row[1](jedenfalls das, was bei Row[1] steht) in die variable $var speichern. Da weiß ich schonmal nicht, wie das geht.
    Dann soll er wieder überprüfen, ob $var jetzt einen Namen hat, der nicht gestattet ist. Wenn der Name wieder wie oben lautet, soll er wieder weitersuchen, also diesmal Row[2]. Und so weiter, bis er einen Namen findet, der gestattet ist.
    ;(

    MfG

  • a) Ein Prozess mit mehreren Fentsern
    Du musst diese Funktion nehmen, die holt alle Fenstertitel von einem Prozess und danach suchst du den richtigen aus.

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>

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

    $list = ProcessList('firefox.EXE')

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

    Dim $result[2]

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

    For $prozessloop = 1 To UBound($list) - 1 ; den Loop hast du ja
    $Fenster = ProcessGetWindow($list[$prozessloop][1]) ; das auch, nur dass deine Funktion nur den 1. Fenstertitel zurückgibt. Diese ein Array mit allen Fenstern vom Prozess
    _ArrayDisplay($Fenster) ; Das kannst du raus machen

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

    ;Ab hier ist es neu
    For $fensterloop = 0 To Ubound($Fenster)-1

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

    If Not Stringinstr($Fenster[$fensterloop][0],"international srobot") And Not Stringinstr($Fenster[$fensterloop][0],"Commandline") THen
    ; Wenn der Titel ungleich int. rob. oder cmdline, dann wird das als Ergebnis genommen und die Schleife beendet.
    $result[0] = $Fenster[$fensterloop][0]
    $result[1] = $Fenster[$fensterloop][1]
    ExitLoop
    Endif

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

    Next
    Next
    ; Result ist jetzt das gesuchte Fenster :) Wenn es keines gibt, ist das Array leer.
    _ArrayDisplay($result,"Found Window, Name + Handle")

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

    Func ProcessGetWindow($PId)
    $PId = ProcessExists($PId)
    If $PId = 0 Then
    SetError(1)
    Else
    Local $WinList = WinList()
    Local $WindowTitle[1][2]
    Local $x = 0
    For $i = 1 To $WinList[0][0]
    If WinGetProcess($WinList[$i][1], "") = $PId And $WinList[$i][0] <> ""Then
    ReDim $WindowTitle[$x+1][2]
    $WindowTitle[$x][0] = $WinList[$i][0]
    $WindowTitle[$x][1] = $WinList[$i][1]
    $x += 1
    EndIf
    Next
    Return $WindowTitle
    EndIf
    EndFunc ;==>ProcessGetWindow

    [/autoit]

    b) Oder werden mehrere Prozesse mit dem gleichen Name gestartet, aber unterschiedlichen Fenstern?

    [autoit]

    $list = ProcessList("sro_client.exe")
    For $i = 1 To UBound($list) - 1
    $var = ProcessGetWindow($list[$i][1]) ; das [1] ist wichtig, damit die PID genommen wird.
    If Not Stringinstr($var,"international srobot") And Not Stringinstr($var,"Commandline") THen ExitLoop
    Next

    [/autoit]
  • A ist schon gut. Das hat gerade schon weitergeholfen, aber, es gibt Probleme.
    Also:

    [autoit]

    #include<Array.au3>

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

    $list = ProcessList("sro_client.exe")
    Dim $result[2]

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

    For $prozessloop = 1 To UBound($list) - 1 ; den Loop hast du ja
    $Fenster = ProcessGetWindow($list[$prozessloop][1]) ; das auch, nur dass deine Funktion nur den 1. Fenstertitel zurückgibt. Diese ein Array mit allen Fenstern vom Prozess
    _ArrayDisplay($Fenster) ; Das kannst du raus machen
    Next

    [/autoit]


    So, diesen Zusatz von wegen

    [autoit]

    For $fensterloop = 0 To UBound($Fenster) - 1
    If Not StringInStr($Fenster[$fensterloop][0], "0x00100282") And Not StringInStr($Fenster[$fensterloop][0], "Commandline") Then
    ; Wenn der Titel ungleich int. rob. oder cmdline, dann wird das als Ergebnis genommen und die Schleife beendet.
    $result[0] = $Fenster[$fensterloop][0]
    $result[1] = $Fenster[$fensterloop][1]
    MsgBox(0, "", $result[1])
    ExitLoop
    EndIf
    Next

    [/autoit]


    brauch ich eigentlich gar nciht mehr. Beim ersten werden 6 Fensternamen angezeigt, eines davon ist das richtige. Wenn man noch das zweite, also das hier drüber dazwischen hat, bleiben am Ende nur noch 2 Fenster übrig, und das richtige ist NIE dabei. Kann man also im ersten Ausschnitt nicht schon die Funktion reinbauen, dass die Namen da überprüft werden und schon da auch in der Variablen gespeichert werden?

    • Offizieller Beitrag
    Zitat

    Vielleicht könnte ja auch jemand anders ma helfen als progandy


    Progandy hat mehrfach daraufhin gewiesen, dass ohne konkrete Angaben keine Hilfe erfolgen kann.
    Deine Angaben sind sehr schwammig. Es könnte dies oder jenes oder ganz was andres in Row[0] stehen :S
    Suche selber erst mal etwas festes in deinem Konstrukt, also einen Wert der definitiv bei einer bestimmten Situation immer auftaucht. Wenn du nur variable Zustände hast, kannst du kein allgemeingültiges Programm erstellen. Punkt