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

Windows winapi查找网页对话框的子窗口标题(属性),windows,excel,winapi,vba,Windows,Excel,Winapi,Vba,我使用winapi来处理网页对话框,除了excel vba编辑器之外,我没有访问visual studio或其他工具的权限。另外,我对winapi没有很好的经验。 我想单击此网页对话框的某些按钮并输入一些文本。 使用winapi,我可以找到它的句柄并尝试枚举子窗口,但收到的信息不正确 ' search for child window accept button hWndAccept = FindWindowEx(hWndColo, 0, vbNullString, vbNullString)

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

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

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


如何获取这些子窗口的属性和其他相关信息?我尝试在winapi文档中查找,但没有成功。

IE浏览器窗口是一个“沉重”的组件,因为它是一个带有hWnd的真正窗口。浏览器窗口(网页)内的内容都是渲染/绘制的,不作为实际的windows组件存在(例如,不是真正的文本框、按钮、列表等),因此windows API无法工作

你有几个选择

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

  • 像您一样使用Windows API连接到现有的API,但存在以下问题:

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

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

    网页上的按钮不是本机windows控件。您需要为该场景使用其他技术,例如。有关Internet Explorer中的网页,请参见。我们似乎无法使用它,因为我们使用的是xp计算机,不允许安装.NET或任何其他SDK。我的下一个想法是更改/操作JS和GET/POST方法。通过病毒保护软件,操作JScript将是一件麻烦事。虽然您注意到您没有访问Visual Studio的权限,但您可以免费获得。中途。您可以找到ie窗口,将其调整为按钮和输入框大小,并可以使用api在其周围导航,单击并发送键:)可能不是最好的方法,但肯定是另一种方法。是的,我这样做了,但是,我想要控制的窗口是一个网页对话框,当我单击网页上的链接时,它会弹出。使用Shdocvw组件,我确实可以在开放的IE窗口中循环,但网页对话框的HWND并没有显示出来(但家长来了)。我有一个疑问,使用WinApi我可以找到网页对话框的HWND,在Shdocvw中,有HWND属性。所以我可以将IE对象设置为网页对话框,通过它我可以控制它。或网页对话框的行为不同于普通网页。使用SHDOCVW或MSHTML库进行网页对话框的任何可能性/示例。@msinfo使用spy++找不到HWND。但是,如果您试图捕获提示对话框的事件,您可以直接在触发它的DOM元素(onClick、onMouseDown等)上进行捕获,以获取更多信息
    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