Seite 1 von 2

Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 10:42
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

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 11:22
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.

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 11:49
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?

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 12:07
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 ?

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 12:09
von Danilo
EnumChildWindows_() probiert?

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 12:10
von IronEagle
EnumChildWindows_() probiert?
Ja, hat leider auch nicht funktioniert.

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 12:17
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

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 12:35
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

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 12:48
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

Re: Hilfe bei "FindWindowEx_"

Verfasst: 27.02.2013 13:15
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.