Hilfe bei "FindWindowEx_"

Anfängerfragen zum Programmieren mit PureBasic.
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Hilfe bei "FindWindowEx_"

Beitrag von IronEagle »

Hallo Leute,

ich versuche von einem anderen Programm das DateGadget auszulesen bzw. dieses zu verändern.
Ich habe mir mit WinSpy die beiden Class Parameter ausgelesen (ich denke da liegt schon mein Fehler) und diese in den unteren Code eingefügt.
Leider funktioniert der Code überhaupt nicht...

Ich hoffe ihr könnt mir ein wenig helfen.

Code: Alles auswählen

EnableExplicit

Define hwnd
Define subhwnd
Define hwndlength
Define content$

hwnd = FindWindow_("WindowsForms10.Window.8.app.0.218f99c",#Null)

If hwnd
  subhwnd=FindWindowEx_(hwnd, #Null, "WindowsForms10.SysDateTimePick32.app.0.218f99c", #Null)
  If subhwnd
    hwndlength = SendMessage_(subhwnd, #WM_GETTEXTLENGTH, 0, 0)+1
    content$ = Space(hwndlength)
    SendMessage_(subhwnd, #WM_GETTEXT, hwndlength, @content$)
    MessageRequester("", content$,0)
  EndIf
EndIf
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Hilfe bei "FindWindowEx_"

Beitrag von Josh »

Bekommst du in hwnd und subhwnd einen Wert oder bleibt der auf Null?
Schreib mal deine vier ermittelten Werte, damit lässt sich der Fehler schon eingrenzen.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Hilfe bei "FindWindowEx_"

Beitrag von Danilo »

Nachdem das Haupfenster mit FindWindow_() gefunden wurde, solltest Du mal mit EnumChildWindows_()
probieren die Kinder zu enumerieren.
Die Klassennamen sehen aber auch verdächtig nach .NET Programmen aus, und da hast Du bei WPF-Programmen
wohl eher schlechte Karten. Während WinForms-Programme noch auf WinAPI aufsetzen (also nur WinAPI wrappen),
ist WPF ein neues Framework was auf DirectX aufsetzt um die Controls/Widgets/Gadgets zu zeichnen, ohne dabei
auf das alte WinAPI-System zurück zu greifen. So etwas wie einen Klassennamen und so gibt es da nicht mehr
direkt, also würde das SendMessage in diesem Falle auch nicht helfen... da es kein klassisches WinAPI DateGadget ist,
sondern ein komplett neues Control/Widget/Gadget.
Aber zuerst mal EnumChildWindows_() probieren, ob Du damit an die Kinder kommst.

EDIT: Ganz übersehen, "WindowsForms10." sieht natürlich nach Windows Forms aus,
was Deine Chancen schon einmal erhöht...
War etwas irritiert vom "Window.8.app"-Teil. Wer schreibt noch alte WinForms-Programme auf Win8?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: Hilfe bei "FindWindowEx_"

Beitrag von IronEagle »

Die Klassennamen sehen aber auch verdächtig nach .NET Programmen aus, und da hast Du bei WPF-Programmen
wohl eher schlechte Karten.
Da hast du recht, ich habe gerade mit dem Hersteller gesprochen und er meinte die Software verwendet .NET :(

Gibt es eine möglichkeit dennoch auf anderem Weg an dieses Gadget zu kommen ?
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Hilfe bei "FindWindowEx_"

Beitrag von Danilo »

EnumChildWindows_() probiert?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: Hilfe bei "FindWindowEx_"

Beitrag von IronEagle »

EnumChildWindows_() probiert?
Ja, hat leider auch nicht funktioniert.
PureBasic 5.71 | Windows 10 Home (x64)
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: Hilfe bei "FindWindowEx_"

Beitrag von IronEagle »

Wenn du mit WinSpy darauf zugreifen kannst, dann solltest du auch mit den API's zugreifen können. Antworte doch einfach mal auf die Fragen, ist ja nicht so kompliziert. So ist das eine sinnlose rumraterei.
Sorry übersehen :)

hwnd = 66485
subhwnd = 0
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Hilfe bei "FindWindowEx_"

Beitrag von Josh »

Probiere mal den folgende Code. Den Findstring kannst zum probieren ja mal beliebig verkleinern.

Code: Alles auswählen

EnableExplicit

Define ClassName .s {256}
Define hWnd      .i
Define hWndSub   .i
Define hwndlength.i
Define content   .s

hwnd = FindWindow_("WindowsForms10.Window.8.app.0.218f99c", #Null)

If hwnd

  hWndSub = GetWindow_(hWnd, #GW_CHILD)
  While hWndSub
    GetClassName_(hWndSub, @ClassName, 98)
    If FindString (ClassName, "WindowsForms10.SysDateTimePick32")
      Debug ClassName
    EndIf
    hWndSub = GetWindow_(hWndSub, #GW_HWNDNEXT)
  Wend

EndIf
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: Hilfe bei "FindWindowEx_"

Beitrag von IronEagle »

Hier mal den code den ich getestet habe, habe noch ein debug einfügt, damit ich ne auflistung der ClassName bekomme.

Code: Alles auswählen

EnableExplicit

Define ClassName .s {256}
Define hWnd      .i
Define hWndSub   .i
Define hwndlength.i
Define content   .s

hwnd = FindWindow_("WindowsForms10.Window.8.app.0.282af8c", #Null)

If hwnd

  hWndSub = GetWindow_(hWnd, #GW_CHILD)
  
  While hWndSub
    
    GetClassName_(hWndSub, @ClassName, 98)
        
    Debug ClassName
    
    If FindString (ClassName, "WindowsForms10.SysDateTimePick32.app.0.282af8c")
      
      Debug ClassName
      
    EndIf
    
    hWndSub = GetWindow_(hWndSub, #GW_HWNDNEXT)
    
  Wend

EndIf
Debugger Ausgabe:

WindowsForms10.STATIC.app.0.282af8c
WindowsForms10.STATIC.app.0.282af8c
WindowsForms10.msctls_progress32.app.0.282af8c
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Hilfe bei "FindWindowEx_"

Beitrag von Danilo »

Probier mal etwas in dieser Richtung:

Code: Alles auswählen

EnableExplicit

Define hWndMain.i

Procedure enum(hWnd,lParam)
    Protected cls.s = Space(1024)
    GetClassName_(hWnd,@cls,1024)
    If cls = "WindowsForms10.SysDateTimePick32.app.0.218f99c"
        Debug "KIND GEFUNDEN!"
    EndIf
    Debug cls
    ProcedureReturn #True
EndProcedure

hWndMain = FindWindow_("WindowsForms10.Window.8.app.0.282af8c", #Null)

If hWndMain

  EnumChildWindows_(hWndMain, @enum(),0)

EndIf
Ich denke damit solltest Du das richtige Kindfenster finden.

In Deinem ersten Beitrag findet sich folgender Abschnitt:

Code: Alles auswählen

    hwndlength = SendMessage_(subhwnd, #WM_GETTEXTLENGTH, 0, 0)+1
    content$ = Space(hwndlength)
    SendMessage_(subhwnd, #WM_GETTEXT, hwndlength, @content$)
Das erste SendMessage_() dabei geht noch klar, aber das Zweite würde bedeuten, dass der
Fremdprozess in Deinen Prozess einen String kopiert, was nicht so einfach möglich ist.
Da muss man dann mit OpenProcess, ReadProcessMemory usw. ran.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten