Нужна помощь с дочерними окнами

Я работаю в vb с визуальной студией 2010.

Приложение AnyOrder больше не поддерживается, и я пытаюсь создать приложение, в котором наши пользователи могут вводить информацию, а затем заполнять ее в AnyOrder (а также на других сайтах — им приходится заполнять много избыточной информации), но у меня есть не повезло вообще получить дочерние окна любого порядка для заполнения, как только данные находятся в приложении окна VB.

Я могу получить дескриптор родительского окна просто отлично, но не могу получить дескриптор дочернего окна, чтобы спасти свою жизнь. Я даже не могу получить первый уровень вниз, и пробелы, которые мне нужно будет заполнить, являются правнуками родительского окна.

Это не позволит мне опубликовать скриншот шпиона ++, так как я только что зарегистрировался и не имею 10 представителей, но вот ссылка на захват.

введите здесь описание изображения

Заранее благодарим вас за любую помощь, которую вы можете предоставить.


person Rodger    schedule 01.11.2013    source источник
comment
Пожалуйста, покажите код, который вы используете для получения дескрипторов окон.   -  person Mark Hall    schedule 01.11.2013
comment
Я не уверен, что я сделал, чтобы это исправить, но я заставил его работать и решил поместить сюда код, который я собрал, на случай, если он кому-то еще понадобится. Возможно, есть лучший способ сделать это, но это, по крайней мере, получает список дескрипторов в массив.   -  person Rodger    schedule 14.11.2013


Ответы (1)


Как-то разобрался с ответом.

#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
person Rodger    schedule 23.11.2013