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...
Windowtitle durch Prozess herausfinden
-
- [ offen ]
-
NoName -
29. März 2008 um 00:10 -
Geschlossen -
Erledigt
-
-
Fals die ersten Buchstaben im Titel gleich bleiben, kannst du WinGetTitle benutzen.
-
- Offizieller Beitrag
Über den Prozeß bekommst du das Handle.
[autoit]
Mit dem Handle kannst du den Titel abfragen.$title = WinGetTitle('Fenster-Handle')
[/autoit] -
Soso, man lernt immerwieder dazu vom großen Meister
-
- Offizieller Beitrag
So kannst du es machen
[autoit]Global $list = ProcessList("SciTE.exe") ; gibt alle Instanzen des Prozesses zurück
[/autoit]
Global $titel = ''
For $i = 1 To $list[0][0]
$titel &= WinGetTitle(WinGetHandle($list[$i][1])) & @LF
Next
MsgBox(0, '', $titel) -
Über den Prozeß bekommst du das Handle.
[autoit]
Mit dem Handle kannst du den Titel abfragen.$title = WinGetTitle('Fenster-Handle')
[/autoit]
Welche handle? WinGetHandle? Kann ja nicht sein... -
- Offizieller Beitrag
Welche handle? WinGetHandle? Kann ja nicht sein...
Kann nicht.. - ist aber so, siehe mein voriges Post.
-
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
ZitatAber 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. -
???
Kommt immmernoch Program Manager raus? -
- 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. -
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.
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>
[/autoit] [autoit][/autoit] [autoit]
$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)
NextFunc ProcessGetWindow($PId)
[/autoit] [autoit][/autoit] [autoit]
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 ;==>ProcessGetWindowFunc ProcessGetId($Process)
[/autoit] [autoit][/autoit] [autoit]
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 ;==>ProcessGetIdFunc ProcessGetName($PId)
[/autoit] [autoit][/autoit] [autoit]
If IsNumber($PId) = 0 Then
SetError(2)
ElseIf $PId > 9999 Then
SetError(1)
Else
Local $PList = ProcessList()
Local $i = 1
Local $ProcessName = ""While $i <= $PList[0][0] And $ProcessName = ""
[/autoit]
If $PList[$i][1] = $PId Then
$ProcessName = $PList[$i][0]
Else
$i = $i + 1
EndIf
WEnd
Return $ProcessName
EndIf
EndFunc ;==>ProcessGetNameMega
-
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
[/autoit] [autoit][/autoit] [autoit]
For $t = 1 To $Test[0][0]
MsgBox(0, "", "Fenstertitel " & $t & ":" & @CRLF & @CRLF & $Test[$t][0])
Next
EndIf#cs
[/autoit]
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 -
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>
[/autoit] [autoit][/autoit] [autoit]
$a = ProcessList('firefox.EXE')For $i = 1 To UBound($a) - 1
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay(ProcessGetWindow($a[$i][1]))
NextFunc ProcessGetWindow($PId)
[/autoit]
$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 -
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>
[/autoit] [autoit][/autoit] [autoit]
$a = ProcessList('EXCEL.EXE')For $i = 1 To UBound($a) - 1
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(ProcessGetWindow($a[$i][0]) & @CRLF)
NextFunc ProcessGetWindow($PId)
[/autoit]
$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 -
Danke, funktioniert super.