vb.netvisual-studio-2010vb.net-2010handlespy++

Need help getting child windows


I am working in vb with visual studio 2010.

The app AnyOrder is no longer supported and I am trying to make an app where our users can type in info and then have the info populate into AnyOrder (and also other sites - they have to populate a lot of redundant info) but I am having no luck at all getting the child windows of any order to populate once the data is in the VB window app.

I can get the parent window handle just fine but can't seem to get a child window handle to save my life. I can't even get the first level down and the blanks that I will need to populate are great grand-children of the parent window.

It won't let me post a screencap of the spy++ since I just signed up and don't have the 10 rep but here is a link to the capture.

enter image description here

Thank you in advance for any assistance that you can provide.


Solution

  • Figured out the answer somehow.

    #Region "functions"
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Int32
    Public Delegate Function EnumWindowProcess(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
    <DllImport("User32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Shared Function EnumChildWindows(ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowProcess, ByVal lParam As IntPtr) As Boolean
    End Function
    Private Shared Function EnumWindow(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
    Dim ChildrenList As List(Of IntPtr) = CType(GCHandle.FromIntPtr(Parameter).Target, Global.System.Collections.Generic.List(Of Global.System.IntPtr))
    ChildrenList = CType(GCHandle.FromIntPtr(Parameter).Target, Global.System.Collections.Generic.List(Of Global.System.IntPtr))
    If ChildrenList Is Nothing Then Throw New Exception("GCHandle Target could not be cast as List(Of IntPtr)")
    ChildrenList.Add(Handle)
    Return True
    End Function
    Private Shared Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr()
    Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList)
    Try
        EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle))
    Finally
        If ListHandle.IsAllocated Then ListHandle.Free()
    End Try
    Return ChildrenList.ToArray
    End Function
    #End Region
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    iParentHandle = FindWindow(vbNullString, AOParentName)
    GetChildWindows(FindWindow(vbNullString, AOParentName))
    Dim Childlist As String = String.Join(". ", ChildrenList)
    MsgBox("list of child windows: " & Childlist)
    End Sub