Windowtitle durch Prozess herausfinden

  • Ich habe ein Programm, welches jedesml einen anderen Fensternamen hat. Nur diesen brauche ich für ein eigenes Tool (wegen WinActive). Deshalb:
    Gibt es eine Möglichkeit den Fenstertitel durch den Prozess oder ähnliches zu bestimmen?
    Danke...

    • Offizieller Beitrag

    So kannst du es machen

    [autoit]

    Global $list = ProcessList("SciTE.exe") ; gibt alle Instanzen des Prozesses zurück
    Global $titel = ''
    For $i = 1 To $list[0][0]
    $titel &= WinGetTitle(WinGetHandle($list[$i][1])) & @LF
    Next
    MsgBox(0, '', $titel)

    [/autoit]
  • Über den Prozeß bekommst du das Handle.
    Mit dem Handle kannst du den Titel abfragen.

    [autoit]

    $title = WinGetTitle('Fenster-Handle')

    [/autoit]


    Welche handle? WinGetHandle? Kann ja nicht sein...

  • Oh, hab das nicht gesehen, sry, aber da kommt folgendes eaus: Program Manager
    Aber der Fenstername von SciTE ist doch der Pfad zur Datei, welche man gerade nutzt, jedenfall bei mir...

    • Offizieller Beitrag
    Zitat

    Aber der Fenstername von SciTE ist doch der Pfad zur Datei, welche man gerade nutzt, jedenfall bei mir...

    Ja klar, das ändert aber nix daran, dass das der Fenster-Titel ist. Und den wolltest du doch erfragen.
    Setzt doch einfach mal einen anderen Prozeß ein, dann siehst du, dass es funzt. :P

    • Offizieller Beitrag

    1:1 kopiert ? Bei mir funzt es tadellos.

    EDIT: Oops - peinlich. Da ich immer mit SciTE getestet habe, hat es funktioniert - weil bei fehllender Angabe, der Titel des aktiven Fensters zurückgegeben wird.
    Naja, man soll halt so spät keine Probleme lösen. :S

  • 1:1 kopiert ? Bei mir funzt es tadellos.

    EDIT: Oops - peinlich. Da ich immer mit SciTE getestet habe, hat es funktioniert - weil bei fehllender Angabe, der Titel des aktiven Fensters zurückgegeben wird.
    Naja, man soll halt so spät keine Probleme lösen. :S


    Hm, verstehe nicht so ganz, was du meinst ;)
    Wenn der Prozess, den ich da drin stehen habe, nicht existiert, bleibt die MsgBox leer. Wenn der Prozess aber existiert, komm immer Program Manager bei raus, egal bei welchem Prozess.

    • Offizieller Beitrag

    Hi,

    probier mal:

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    $a = ProcessGetId('EXCEL.EXE')
    ;~ ConsoleWrite(ProcessGetWindow($a[1]) & @CRLF)
    ;~ WinSetState(ProcessGetWindow($a[1]), "", @SW_HIDE)
    ;~ Sleep(2000)
    ;~ WinSetState(ProcessGetWindow($a[1]), "", @SW_SHOW)
    ;~ _ArrayDisplay($a)
    For $i = 1 To UBound($a) - 1
    ConsoleWrite(ProcessGetWindow($a[$i]) & @CRLF)
    Next

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

    Func ProcessGetWindow($PId)
    If IsNumber($PId) = 0 Or ProcessExists(ProcessGetName($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] [autoit][/autoit] [autoit]

    Func ProcessGetId($Process)
    If IsString($Process) = 0 Then
    SetError(2)
    ElseIf ProcessExists($Process) = 0 Then
    SetError(1)
    Else
    Local $PList = ProcessList($Process)
    Local $i
    Local $PId[$PList[0][0] + 1]
    $PId[0] = $PList[0][0]
    For $i = 1 To $PList[0][0]
    $PId[$i] = $PList[$i][1]
    Next
    Return $PId
    EndIf
    EndFunc ;==>ProcessGetId

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

    Func ProcessGetName($PId)
    If IsNumber($PId) = 0 Then
    SetError(2)
    ElseIf $PId > 9999 Then
    SetError(1)
    Else
    Local $PList = ProcessList()
    Local $i = 1
    Local $ProcessName = ""

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

    While $i <= $PList[0][0] And $ProcessName = ""
    If $PList[$i][1] = $PId Then
    $ProcessName = $PList[$i][0]
    Else
    $i = $i + 1
    EndIf
    WEnd
    Return $ProcessName
    EndIf
    EndFunc ;==>ProcessGetName

    [/autoit]

    Mega

  • Hab auch noch was ähnliches geschrieben.
    Unterschied ist das aber alle sichtbaren Fenster eines Prozesses zurückgegeben werden und nicht nur das erste gefundene:

    Spoiler anzeigen
    [autoit]

    $Test = _ProcessGetWindows("firefox.exe")

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

    If Not @error Then
    For $t = 1 To $Test[0][0]
    MsgBox(0, "", "Fenstertitel " & $t & ":" & @CRLF & @CRLF & $Test[$t][0])
    Next
    EndIf

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

    #cs
    Return an 2Dim-Array of all visible Windows of a Process and is made up follows:
    The array returned is two-dimensional and is made up as follows:
    $array[0][0] = Number of windows returned
    $array[1][0] = 1st window title
    $array[1][1] = 1st window handle (HWND)
    $array[2][0] = 2nd window title
    $array[2][1] = 2nd window handle (HWND)
    ...
    $array[n][0] = nth window title
    $array[n][1] = nth window handle (HWND)
    #ce
    Func _ProcessGetWindows($PID)
    Local $WList = WinList()
    Local $RArr[1][2]

    If Not ProcessExists($PID) Then Return SetError(2, 2, $RArr)

    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][2]
    $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]
  • Hab vorhin die Funktion angepasst. Es werden aber nur die Fenster von einem Prozess zurückgegeben, nicht von allen mit dem Namen :)

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    $a = ProcessList('firefox.EXE')

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

    For $i = 1 To UBound($a) - 1
    _ArrayDisplay(ProcessGetWindow($a[$i][1]))
    Next

    [/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]
  • Ok, danke erstmal. Nur mit Arrays kenne ich mich überhaupt nicht aus. Das, was ich als Fenstername suche steht immer bei Row [0] (ist halt der Wert von Col 0). Das Fenster, wo er das gefundene anzeigt soll auch weg, dafür soll er nur den Wert von Row [0] bei Col 0 als Variable speichern. Wie mache ich das?
    (Beim Script von progandy)

  • Der erste Fenstertitel:

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    $a = ProcessList('EXCEL.EXE')

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

    For $i = 1 To UBound($a) - 1
    ConsoleWrite(ProcessGetWindow($a[$i][0]) & @CRLF)
    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]