Hallo,
wie kann ich am besten den Fenstertitel von einem Programm ermitteln?
Ziel ist es bei Spotify.exe den aktuellen Fenstertitel heraus zu lesen.
Fenstertitel über exe ermitteln.
Fenstertitel über exe ermitteln.
PureBasic 6.00 | Windows 10 pro (x64)
Re: Fenstertitel über exe ermitteln.
Mit GetWindowText_() https://docs.microsoft.com/en-us/window ... indowtexta
Window Handle kann z.B. mit EnumWindows_() https://docs.microsoft.com/en-us/window ... numwindows ermittelt werden.
Window Handle kann z.B. mit EnumWindows_() https://docs.microsoft.com/en-us/window ... numwindows ermittelt werden.
Re: Fenstertitel über exe ermitteln.
Kann ich das Handle auch über den laufenden Prozess (spotify.exe) herausfinden? Mit EnumWindows_ scheint das nicht zu gehen!
Wie kann ich den Klassennamen von einem laufendem Programm herausfinden?
Wie kann ich den Klassennamen von einem laufendem Programm herausfinden?
PureBasic 6.00 | Windows 10 pro (x64)
Re: Fenstertitel über exe ermitteln.
Edit:
Hat das Fenster Spotify im Titel?
Hat das Fenster Spotify im Titel?
Re: Fenstertitel über exe ermitteln.
Leider nicht, aber ich bin schon ein Stück weiter:Mijikai hat geschrieben:Edit:
Hat das Fenster Spotify im Titel?
Code: Alles auswählen
EnableExplicit
Procedure ListWindows(hwnd,lParam)
Protected.s title = Space(1000),class = Space(1000)
If GetWindowLong_(hwnd,#GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW And GetWindowLong_(hwnd,#GWL_STYLE) & #WS_VISIBLE
GetClassName_(hwnd,class,1000)
GetWindowText_(hwnd,title,1000)
If title <> ""
Debug "Title: "+title+" | Class: "+class+" | Handle: "+Str(hwnd)
EndIf
EndIf
ProcedureReturn #True
EndProcedure
EnumChildWindows_(FindWindow_("ToolbarWindow32",0),@ListWindows(),0)

PureBasic 6.00 | Windows 10 pro (x64)
Re: Fenstertitel über exe ermitteln.
Sieht gut aus, geht in die richtige Richtung 
Habe trotzdem mal was geschrieben (komplett kommentiert, hoffe es hilft):

Habe trotzdem mal was geschrieben (komplett kommentiert, hoffe es hilft):
Code: Alles auswählen
;hab mich für GetWindow_() anstelle EnumWindows_() entschieden
EnableExplicit;<- um fehler zu finden (am besten immer verwenden!)
Procedure.s GetProcessWindowText(Process.s)
Protected handle.i
Protected pid.i
Protected proc.PROCESSENTRY32
Protected buffer.s
Protected check.i
handle = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null);<- snapshot handle holen
If Not handle = #INVALID_HANDLE_VALUE;<- wenn das handle ok ist weitermachen
proc\dwSize = SizeOf(PROCESSENTRY32);<- um die struktur benutzen zu können muss die größe übergeben werden
If Process32First_(handle,@proc);<- den ersten eintrag in der prozess liste holen
Repeat
If PeekS(@proc\szExeFile) = Process;<- schauen ob der eintrag der gesuchte ist (string vergleich)
pid = proc\th32ProcessID;<- wenn der eintrag der gesuchte ist die process id auslesen
Break;<- die suche abbrechen da die process id gefunden wurde
EndIf
Until Process32Next_(handle,@proc) = #False;<- falscher eintrag? dann weitersuchen
EndIf
CloseHandle_(handle);<- handle wieder freigeben
If pid;<- wurde die process id gefunden?
handle = GetWindow_(GetDesktopWindow_(),#GW_CHILD);<- das erste fenster handle holen (erstes fenster is immer das 'child' des desktops)
If handle;<- gibt es ein fenster weitermachen
Repeat
GetWindowThreadProcessId_(handle,@check);<- process id des fensters ermitteln
If check = pid And IsWindowVisible_(handle);<- wenn das fenster sichtbar (reicht meist um das richtige fenster zu bekommen *) ist und die process id die gesuchte ist weitermachen
check = GetWindowTextLength_(handle);<- die länge des fenster titels ermitteln (in chars)
If check;<- gibt es eine länge weitermachen
buffer = Space(check);<- speicher für den titel reservieren
If GetWindowText_(handle,@buffer,check + 1) = check;<- den titel auslesen (wichtig die api will einen char mehr! - siehe msdn)
ProcedureReturn buffer;<- den titel zurückgeben
EndIf
EndIf
EndIf
handle = GetWindow_(handle,#GW_HWNDNEXT);<- falsches fenster - weitersuchen
Until handle = #Null
EndIf
EndIf
EndIf
ProcedureReturn #Null$;<- nichts wurde gefunden
EndProcedure
;* wenn IsWindowVisible_() nicht reicht andere aspekte abfragen und vergleichen!
Debug GetProcessWindowText("PureBasic.exe");<- test den titel von PureBasic.exe ermitteln
End;<- programm beenden
;infos zu allen apis gibts bei 'msdn':
;https://docs.microsoft.com/en-us/windows/win32/api/
Re: Fenstertitel über exe ermitteln.
JAAA... und wie das hilft!!! Vielen Dank!!! 

PureBasic 6.00 | Windows 10 pro (x64)