Windows winapi查找网页对话框的子窗口标题(属性)
我使用winapi来处理网页对话框,除了excel vba编辑器之外,我没有访问visual studio或其他工具的权限。另外,我对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,我可以找到它的句柄并尝试枚举子窗口,但收到的信息不正确
' 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无法工作 你有几个选择
- 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