我正在使用 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 文档中查找,但没有成功。
最佳答案
IE 浏览器窗口是一个“重”组件,因为它是一个带有 hWnd 的真正窗口。浏览器窗口(网页)内的内容都是渲染/绘制的,并不作为实际的窗口组件存在(例如,不是真正的文本框、按钮、列表等),因此 Windows API 将无法工作。
您有几个选择。
在你的项目中实例化一个 Form 中的 WebBrowser 控件(你可以看到更多关于控件的一般信息 here )
像您一样使用 Windows API 连接到现有的 can see here但这充满了问题,包括:
- IE 安全和组策略可以禁用白名单上的组件连接到现有组件的能力
- 如果允许这样做,您仍然会遇到 AV 阻止它的问题
- 更改 IE 窗口布局变得棘手,因为 v7 与 v8 发生了变化,其中 IE“框架”(不是 iframe)与选项卡内的“文档”相关。
如果您正在启动导航(例如,打开 IE 转到某个网页)以根据文档填写表单,那么我建议您使用网络浏览器控件或在代码中创建 ShDocVw 组件,以便您可以与直接DOM。这样,您根本不必使用 Windows API 来“查找”HTML 元素,并且可以直接使用 HTML 文档及其属性。
关于windows - winapi查找网页对话框的子窗口标题(属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473607/