Text aus Steuerelement auslesen: SSPanelWndClass

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Beefi
Beiträge: 88
Registriert: 16.01.2017 17:38

Text aus Steuerelement auslesen: SSPanelWndClass

Beitrag von Beefi »

Liebe Forenmitglieder,

ich würde gerne aus einer bestehenden Anwendung Textinhalte von Steuerelementen auslesen.
Bei einem Typ Steuerelement klappt es jedoch nicht. Es sieht aus wie ein simples Textfeld bzw. StringGadget...WinSpy sagt, es handelt
sich um die Klasse SSPanelWndClass. Sagt das einem was? Hat jemand einen Tip, wie man an den Textinhalt kommt?
Beim Stöbern im Netz nach "SSPanelWndClass" stößt man immer wieder auf eine Klasse namens "ThunderRT6FormDC". Diese Klasse taucht auch bei meinem Programm auf, wenn ich mit WinSpy tiefer in den Stammbaum blicke.

GetWindowText_ auf das Handle des Steuerelements gibt keinen Text zurück.
Auch mittels SendMessage_ (#WM_GETTEXT) bekomme ich keinen Text zurück.

Über Hilfe würde ich mich freuen :praise:

VG Andi
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Text aus Steuerelement auslesen: SSPanelWndClass

Beitrag von Kiffi »

Ein Panel müsste ein Art Container sein, in dem sich das eigentliche Element als Kind befindet. Kannst Du die Children des Panels auslesen?
Hygge
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Text aus Steuerelement auslesen: SSPanelWndClass

Beitrag von jacdelad »

Ich hatte mal ein to geschrieben, das alle Fenster und deren children aufführt und die Texte ausliest. Ich schau morgen mal, ob ich es finde, vielleicht hilft es.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Text aus Steuerelement auslesen: SSPanelWndClass

Beitrag von jacdelad »

Versuche mal das:

Code: Alles auswählen

EnableExplicit
Global window,liste,event

Procedure.s GetClassName(hwnd)
  Protected *temp,temp.s
  *temp=AllocateMemory(1024)
  If GetClassName_(hwnd, *temp, 1024)=0
    temp=Space(1024)
    GetClassName_(hwnd, temp, 1024)
  Else
    temp=PeekS(*temp)
  EndIf    
  FreeMemory(*temp)
  ProcedureReturn temp
EndProcedure

Procedure EnumProc(hwnd)
  Protected title.s{1024},class.s{1024}
  GetWindowText_(hwnd,@title,1024)
  class=GetClassName(hwnd)
  AddGadgetItem(liste,-1,title+Chr(10)+class+Chr(10)+Str(hwnd))
  ProcedureReturn #True
EndProcedure

Procedure EnumChildren(hWnd.i)
  Protected nexthwnd.i, szClass.s{1024}, szText.s{1024},rect.rect,size,parts,count,*temp,*temp2,process
  nexthwnd = GetWindow_(hwnd, #GW_CHILD | #GW_HWNDFIRST)
  While nexthwnd <> 0
    szClass=GetClassName(nexthwnd)
    size=SendMessage_(nexthwnd,#WM_GETTEXTLENGTH,0,0)
    ;GetWindowText_(nexthwnd, @szText, SizeOf(szText))
    ;SendMessage_(nexthwnd, #WM_GETTEXT, SizeOf(szText), @szText)
    SendMessage_(nexthwnd, #WM_GETTEXT, size+1, @szText)
    GetWindowRect_(nexthwnd,rect)
    PrintN("Enabled="+Str(IsWindowEnabled_(nexthwnd))+" ID="+Str(GetDlgCtrlID_(nexthwnd))+" Rect="+Str(rect\left)+","+Str(rect\top)+","+Str(rect\right)+","+Str(rect\bottom)+" Class=" + szClass + " Length="+Str(SendMessage_(nexthwnd, #WM_GETTEXTLENGTH,0,0))+" Text=" + szText)
    If szClass="msctls_statusbar32"
      parts=SendMessage_(nexthwnd,#SB_GETPARTS,0,0)
      PrintN("Parts: "+Str(parts))
      For count=0 To parts-1
        size=SendMessage_(nexthwnd,#SB_GETTEXTLENGTH,count,0)
        PrintN("Size: "+Str(size))
        ;szText=Space(size)
        process=OpenProcess_(#PROCESS_ALL_ACCESS,#False,GetCurrentProcessId_())
        *temp=VirtualAllocEx_(process, #Null, 512,#MEM_COMMIT, #PAGE_READWRITE)
        PrintN("Result: "+Str(SendMessage_(nexthwnd,#SB_GETTEXT,count,*temp)))
        *temp2=AllocateMemory(512)
        ReadProcessMemory_(process,*temp,*temp2,512,#Null)
        PrintN(Str(count)+": "+PeekS(*temp))
        PrintN(Str(count)+": "+PeekS(*temp2))
        VirtualFreeEx_(process,*temp,0,#MEM_RELEASE)
        FreeMemory(*temp2)
      Next
    EndIf
    EnumChildren(nexthwnd)
    nexthwnd = GetWindow_(nexthwnd, #GW_HWNDNEXT)
  Wend
EndProcedure

OpenConsole()
ExamineDesktops()
window=OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,700,800,"Window-Enumerator",#PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
liste=ListIconGadget(#PB_Any,0,0,700,800,"Window",300,#PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
AddGadgetColumn(liste,1,"Class",300)
AddGadgetColumn(liste,2,"Handle",80)
AddKeyboardShortcut(window,#PB_Shortcut_F5,1000)
EnumWindows_(@EnumProc(),0)
Repeat
  event=WaitWindowEvent()
  If EventMenu()=1000
    ClearGadgetItems(liste)
    EnumWindows_(@EnumProc(),0)
  ElseIf EventType()=#PB_EventType_LeftDoubleClick And EventGadget()=liste
    If GetGadgetState(liste)<>-1
      ClearConsole()
      PrintN("Start")
      ;BringWindowToTop_(Val(GetGadgetItemText(liste,GetGadgetState(liste),2)))
        EnumChildren(Val(GetGadgetItemText(liste,GetGadgetState(liste),2)))
      PrintN("Ende")
    EndIf
  EndIf
Until event=#PB_Event_CloseWindow
RemoveKeyboardShortcut(window,#PB_Shortcut_F5)
CloseWindow(window)
End
Doppelklick auf ein Element zeigt die Subelemente an. Vielleicht findest du da deinen Text. Das Ganze ist absolut verbesserungwürdig und nur mal aus der Not heraus entstanden. Bin für alle Verbesserungen offen.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Beefi
Beiträge: 88
Registriert: 16.01.2017 17:38

Re: Text aus Steuerelement auslesen: SSPanelWndClass

Beitrag von Beefi »

Hi vielen Dank für die Unterstützung :allright:

@Kiffi:
Laut WinSpy hat das Element keine Children-Elemente mehr.


@jacdelad:
Das Programm ist echt nicht schlecht. Vielen Dank! Es zeigt im Grunde die gleich Infos an, wie WinSpy, aber evtl. kommen hier noch übersehene Klassen ans Tageslicht.
Leider auch hier keine Textinformation vorhanden. Ich habe jede Klasse mit Doppelklick mehrmals durchgesehen :)
Mit deinem Programm sieht man ganz gut, dass die Software übersäht ist mit Klassen des Typs "ThunderRT6FormDC" und "SSPanelWndClass".
Die Steuerelemente "SSPanelWndClass" bilden manchmal Text ab, manchmal Icons...all diese Steuerelemente sind nicht (mir meinen bekannten Mitteln) auslesbar.

Hat vielleicht noch jemand ein Ass im Ärmel? :mrgreen:
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Text aus Steuerelement auslesen: SSPanelWndClass

Beitrag von jacdelad »

Den Kern des Tools habe ich nicht selbst geschrieben, der kommt von Keya (https://www.purebasic.fr/english/viewto ... 27#p501927). Ich hab es nur minimal angepasst und in eine simple Oberfläche gepackt (übrigens kannst du mit F5 die Liste aktualisieren). Dabei ist mir aufgefallen, dass es 1. zwei verschiedene Möglichkeiten gibt die Titelleiste eines Fensters auszulesen, 2. Statusbars nur auslesbar sind, wenn sie nur eine Zelle besitzen (und auch dann manchmal nicht) und 3. neuere Programme/Apps so gut wie nie auslesbar sind, weil sie andere Methoden zur Erstellung von Gadgets benutzen als die "klassischen" Win32-Controls.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Antworten