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
VG Andi
Text aus Steuerelement auslesen: SSPanelWndClass
Re: Text aus Steuerelement auslesen: SSPanelWndClass
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
- jacdelad
- Beiträge: 348
- Registriert: 03.02.2021 13:39
- Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
- Wohnort: Riesa
- Kontaktdaten:
Re: Text aus Steuerelement auslesen: SSPanelWndClass
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
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
- jacdelad
- Beiträge: 348
- Registriert: 03.02.2021 13:39
- Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
- Wohnort: Riesa
- Kontaktdaten:
Re: Text aus Steuerelement auslesen: SSPanelWndClass
Versuche mal das:
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.
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
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
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
Re: Text aus Steuerelement auslesen: SSPanelWndClass
Hi vielen Dank für die Unterstützung
@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?
@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?
- jacdelad
- Beiträge: 348
- Registriert: 03.02.2021 13:39
- Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
- Wohnort: Riesa
- Kontaktdaten:
Re: Text aus Steuerelement auslesen: SSPanelWndClass
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
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