6

我正在使用 winapi 处理网页对话框,除了 excel vba 编辑器之外,我无法访问 Visual Studio 或其他工具。另外,我对winapi没有很好的经验。我想单击此网页对话框的某个按钮并输入一些文本。
使用winapi我可以找到它的句柄并尝试枚举子窗口,但收到的信息不正确。

' search for child window accept button
hWndAccept = FindWindowEx(hWndColo, 0, vbNullString, vbNullString)
Debug.Print hWndAccept

Public Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
  Dim slength As Long
  Dim wintext As String                         ' window title text length and buffer
  Dim retval As Long                            ' return value
  Dim textlen As Long

Static winnum As Integer                      ' counter keeps track of how many windows have been enumerated
winnum = winnum + 1

textlen = GetWindowTextLength(hWnd) + 1
' Make sufficient room in the buffer.
wintext = Space(textlen)
' Retrieve the text of window Form1.
slength = GetWindowText(hWnd, wintext, textlen)
' Remove the empty space from the string, if any.
wintext = Left(wintext, slength)
' Display the result.
Debug.Print winnum & wintext

EnumChildProc = 1                             ' nonzero return value means continue enumeration
End Function

即使我使用“按钮”类型,第一个函数也不返回按钮子窗口(html按钮类型可能有点不同),所以我想枚举子窗口。这样做我得到了 9 个子窗口的计数,其中我只得到了两个的标题。getwindows 文本不显示任何内容。

我怎样才能获得有关这些子窗口的属性和其他相关信息?我尝试在 winapi 文档中查找,但没有运气。

4

1 回答 1

2

IE 浏览器窗口是一个“重”组件,因为它是一个带有 hWnd 的真正窗口。浏览器窗口(网页)内的内容全部被渲染/绘制,并且不作为实际的窗口组件存在(例如,不是真正的文本框、按钮、列表等),因此 Windows API 将不起作用。

你有几个选择。

  1. 在项目的表单中实例化 WebBrowser 控件(您可以在此处查看有关该控件的更多信息)

  2. 使用 Windows API 连接到现有的 API,就像您可以在此处看到的那样,但这充满了问题,包括:

    • IE 安全和组策略可以禁用白名单上的组件连接到现有组件的能力
    • 如果允许这样做,您仍然会遇到 AV 阻止它的问题
    • IE 窗口布局的更改变得棘手,因为 v7 与 v8 在 IE“框架”(不是 iframe)与选项卡内的“文档”相关的位置发生了变化。

如果您正在启动导航(例如打开 IE 以转到某个网页)以根据文档填写表单,那么我建议您使用 webbrowser 控件或在代码中创建 ShDocVw 组件,以便您可以直接与 DOM 交互. 这样,您根本不必使用 Windows API 来“查找”HTML 元素,并且可以直接使用 HTML 文档及其属性。

于 2013-09-03T14:39:34.307 回答