VBA Function FindWindowEx

Status
Niet open voor verdere reacties.

Henk2802

Gebruiker
Lid geworden
20 apr 2016
Berichten
7
Beste mensen,

Via (Excel) VBA probeer ik een applicatiescherm uit te lezen om zo uiteindelijk bepaalde data naar een aantal invoervelden weg te kunnen schrijven.
Dit doe ik door middel van de functies FindWindow en FindWindowEx.

Via het programma Spy++ zie ik dat het applicatiescherm de volgende indeling heeft:
Spy++.JPG

Het lukt mij om de applicatie te laten vinden met de functie FindWindow (hwindow1 geeft waarde > 0 terug), door middel van de volgende code:
Code:
hwindow1 = FindWindow(vbNullString, "Easy Medea 6.8.1.0")

Uiteindelijk wil ik een textbox "TEdit" vinden en gaan vullen.
Voor zover ik heb kunnen vinden, moet ik dan eerst via FindWindowEx de onderdelen "TPanel", "TGroupBox" (documentgegevens) zien te vinden.
Op zich heb ik geen probleem om "TPanel" te vinden, maar ligt het probleem bij het vinden van de juiste "TGroupBox", want die komt meerdere keren voor op "TPanel".
Met de onderstaande code kan ik alleen de 1e "TGroupBox" vinden:
Code:
view1 = FindWindowEx(hwindow1, 0&, "TPanel", vbNullString)
    view2 = FindWindowEx(view1, 0&, "TGroupBox", vbNullString)

Ik moet echter de "TGroupBox" hebben waar een 2 achter staat in het bijgesloten plaatje.
Tot nu heeft mijn zoektocht op internet niks opgeleverd. Weet iemand hier hoe ik een volgende "TGroupBox" kan benaderen via functie FindWindowEx?
 
Het werken met findwindow en spy++, is lastig voor helpers omdat die jouw programma "easy medea" niet hebben.

Kijk eens in deze draadjes,zie https://www.helpmij.nl/forum/showthread.php/893233-Klembord-overvol-melding-bij-afsluiten en https://www.helpmij.nl/forum/showth...d-!-quot-E-v-R-quot-excellent-code?styleid=15
Dit is code voor het leegmaken van het office klembord, dus kan deze zelf regel voor regel volgen, en dus kijken hoe zoiets werkt.
Volgens mij kan je de functie "EnumChildWindows" gebruiken om een index te krijgen.

Een andere mogelijkheid is om met "autohotkey" een script te schrijven.
Autohotkey is een programma dat toetsaanslagen simuleert eventueel gekoppeld aan programmacode en een gegevensbestand.
 
Laatst bewerkt:
Bedankt voor je reactie.

Autohotkey kan ik helaas niet gebruiken.
Op mijn werk kan ik geen eigen programma's instaleren vanwege beveiligingsinstellingen.

Ik zal de EnumChildWindows morgen eens bekijken op mijn werk of ik daar iets mee kan. Zal nog laten weten hoe dit is verlopen.
 
Misschien dat dit ook werkt
Code:
view2 = FindWindowEx(view1, 0&, "TGroupBox", [COLOR="#FF0000"]"Documentgegevens"[/COLOR])
 
Misschien dat dit ook werkt
Code:
view2 = FindWindowEx(view1, 0&, "TGroupBox", [COLOR="#FF0000"]"Documentgegevens"[/COLOR])

Dit werkt inderdaad, dat ik daar zelf niet op kon komen... :shocked:

Ik had inmiddels ook via de andere optie (EnumChildWindow) ook iets gevonden om alles te achterhalen op een scherm.
Dus dat wil ik bij deze toch nog even delen. Wellicht voor iemand anders te gebruiken:

Code:
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long

Dim windows() As Long
Dim windowsCount As Long

Function ChildWindows(ByVal hWnd As Long) As Long()

    windowsCount = 0
    If hWnd Then
        EnumChildWindows hWnd, AddressOf EnumWindows_CBK, 1
    Else
        EnumWindows AddressOf EnumWindows_CBK, 1
    End If

    ReDim Preserve windows(windowsCount) As Long
    ChildWindows = windows()
    
End Function

Public Function EnumWindows_CBK(ByVal hWnd As Long, ByVal lParam As Long) As Long

    If windowsCount = 0 Then
        ReDim windows(100) As Long
    ElseIf windowsCount >= UBound(windows) Then
        ReDim Preserve windows(windowsCount + 100) As Long
    End If

    windowsCount = windowsCount + 1

    Debug.Print hWnd & " - " & getNameFromHwnd(hWnd)
    If sValue = getNameFromHwnd(hWnd) Then
        lpWindow = hWnd
    End If
    
    windows(windowsCount) = hWnd

    EnumWindows_CBK = 1
    
End Function

Public Function getNameFromHwnd(hWnd As Long) As String

Dim title As String * 255
Dim tLen As Long

tLen = GetWindowTextLength(hWnd)

GetWindowText hWnd, title, 255

getNameFromHwnd = Left(title, tLen)

End Function

'aanroepen met

Sub findHnwds()

ChildWindows (FindWindow(vbNullString, "Easy Medea 6.8.1.0"))

End Sub

Bovenstaande gaat alles af in het scherm en dan geeft het in dit geval het nummer van hwnd en de naam ervan in het 'Direct' venster van de VBA Editor.
Met een kleine aanpassing kan je dan ook naar een bepaalde waarde laten zoeken en zo de hwnd achterhalen om die later weer te gebruiken.

In elk geval super bedankt voor het meedenken alphamax :thumb:
Heb met je tips ook weer andere dingen kunnen leren :cool:
 
Nu de volgende stap met "sendmessage" en "WM_SET_TEXT" iets in de "TEdit" zetten.
en daarna nog op enter duwen of klikken.

terzijde, wat voor een applicatie is "easy medea"?
 
Nu de volgende stap met "sendmessage" en "WM_SET_TEXT" iets in de "TEdit" zetten.
en daarna nog op enter duwen of klikken.

terzijde, wat voor een applicatie is "easy medea"?


Het was al snel gelukt om iets in "TEdit" te vullen.
Easy Medea is een kleine toepassing bij ons bedrijf waarmee een bestand in ons elektronische archief kan worden gezet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan