windows - winapi查找网页对话框的子窗口标题(属性)

标签 windows excel winapi vba

我正在使用 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 将无法工作。

您有几个选择。

  1. 在你的项目中实例化一个 Form 中的 WebBrowser 控件(你可以看到更多关于控件的一般信息 here )

  2. 像您一样使用 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/

相关文章:

C++ 从字符串化字节转换字节数组

windows - Go程序访问线程环境 block 时出现panic

python - 使用 xlwt 将超链接添加到带有文本的单元格

c++ - 为什么在 winapi 中转换 UTF16 -> UTF8 -> UTF16 后文件名有不同的字节?

java - 使用 Apache POI 确定安装的 Microsoft Excel 版本?

r - 如何在R中读取多个.xlsx并生成多个数据帧?

c - 如何在 Windows 中退出阻塞的 recv()?

windows - CheckBox disabled - 仅禁用复选框,不禁用标签

windows - Cmd Prompt 和 Ubuntu Terminal 一样吗?

php - 使用 PHP 查找 Windows 32 或 64 位