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

Posted

技术标签:

【中文标题】winapi查找网页对话框的子窗口标题(属性)【英文标题】:winapi find child windows title (properties) of web page dialog 【发布时间】:2013-08-27 19:09:55 【问题描述】:

我正在使用 winapi 处理网页对话框,我无法访问 Visual Studio 或除 excel vba 编辑器之外的其他工具。另外,我对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 文档中查找,但没有运气。

【问题讨论】:

网页上的按钮不是本机 Windows 控件。您需要针对该场景使用其他技术,例如 UI Automation。对于 Internet Explorer 中的网页,请参阅UI Automation for W3C Accessible Rich Internet Applications Specification。 好像不能用,因为我们用的是xp机器,不允许安装.NET或者其他SDK。我的下一个想法是更改/操作 JS 和 GET/POST 方法。 操作JScript会很麻烦,被病毒防护软件偷偷摸摸。 虽然您注意到您无权访问 Visual Studio,但您可以免费获得 Microsoft Visual Studio Express 2012。 到了一半。您找到 ie 窗口,将其大小调整为按钮和输入框,然后您可以使用 api 和单击并发送键在其周围导航:) 可能不是最好的方法,但绝对是一种替代方法。 【参考方案1】:

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

你有几个选择。

    在您的项目的表单中实例化一个 WebBrowser 控件(您可以在一般情况下查看有关该控件的更多信息here)

    像您can see here 一样使用 Windows API 连接到现有的 API,但这存在很多问题,包括:

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

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

【讨论】:

是的,我这样做了,但是,我想控制的窗口是一个网页对话框,当我单击网页上的链接时,它会弹出。使用 Shdocvw 组件确实我可以循环浏览打开的 IE 窗口,但网页对话框的 HWND 没有显示(但父母来了)。我有一个疑问,使用WinApi我可以找到网页对话框的HWND,并且在Shdocvw中,有HWND属性。那么我可以将一个IE对象设置为网页对话框,我可以通过它来控制它。或者网页对话框的行为与普通网页不同。使用 SHDOCVW 或 MSHTML 库进行网页对话框的任何可能性/示例。 @msinfo 我无法使用 spy++ 找到 HWND。但是,如果您尝试捕获提示对话框的事件,您可以直接在触发它的 DOM 元素上执行此操作(onClick、onMouseDown 等)See here 了解更多信息

以上是关于winapi查找网页对话框的子窗口标题(属性)的主要内容,如果未能解决你的问题,请参考以下文章

LabVIEW图形界面问题

C# 如何打开一个文件的属性窗口,还有如何打开WebBrowser控件加载的网页的属性。

WinAPI - C++ - 将超链接添加到窗口

网页点了没反应,怎么回事?

未创建对话框 WinAPI

为啥图片拖不进对话框,拖的话,会从网页上打开,复制粘贴都没用