Fenstertitel über exe ermitteln.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Fenstertitel über exe ermitteln.

Beitrag von Zerosurf »

Hallo,
wie kann ich am besten den Fenstertitel von einem Programm ermitteln?

Ziel ist es bei Spotify.exe den aktuellen Fenstertitel heraus zu lesen.
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Fenstertitel über exe ermitteln.

Beitrag von Zerosurf »

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?
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Fenstertitel über exe ermitteln.

Beitrag von Zerosurf »

Mijikai hat geschrieben:Edit:
Hat das Fenster Spotify im Titel?
Leider nicht, aber ich bin schon ein Stück weiter:

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)
Damit liste ich mal alle sichtbaren Prozesse auf und muss mir nur noch eine Auswahl Dropdown Liste machen! ;-)
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Fenstertitel über exe ermitteln.

Beitrag von Mijikai »

Sieht gut aus, geht in die richtige Richtung :)

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/

Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Fenstertitel über exe ermitteln.

Beitrag von Zerosurf »

JAAA... und wie das hilft!!! Vielen Dank!!! :allright:
PureBasic 6.00 | Windows 10 pro (x64)
Antworten