请教问题:怎么获取Internet Explorer_Server中的内容

feiyafei2008 2010-02-18 03:46:30
  已经可以获以某个窗口内的子窗口“Internet Explorer_Server”控件对象,怎样获取该对象html的内容或标题或者url。下面是vb一个函数不知道如何转成vfp的。

'
' IEDOMFromhWnd
'
' Returns the IHTMLDocument interface from a WebBrowser window
'
' hWnd - Window handle of the control
'
Function IEDOMFromhWnd(ByVal hWnd As Long) As IHTMLDocument
Dim IID_IHTMLDocument As UUID
Dim hWndChild As Long
Dim lRes As Long
Dim lMsg As Long
Dim hr As Long

If hWnd <> 0 Then

If Not IsIEServerWindow(hWnd) Then

' Find a child IE server window
EnumChildWindows hWnd, AddressOf EnumChildProc, hWnd

End If

If hWnd <> 0 Then

' Register the message
lMsg = RegisterWindowMessage("WM_HTML_GETOBJECT")

' Get the object pointer
Call SendMessageTimeout(hWnd, lMsg, 0, 0, _
SMTO_ABORTIFHUNG, 1000, lRes)

If lRes Then

' Initialize the interface ID
With IID_IHTMLDocument
.Data1 = &H626FC520
.Data2 = &HA41E
.Data3 = &H11CF
.Data4(0) = &HA7
.Data4(1) = &H31
.Data4(2) = &H0
.Data4(3) = &HA0
.Data4(4) = &HC9
.Data4(5) = &H8
.Data4(6) = &H26
.Data4(7) = &H37
End With

' Get the object from lRes
hr = ObjectFromLresult(lRes, IID_IHTMLDocument,_
0, IEDOMFromhWnd)

End If

End If

End If

End Function
...全文
334 3 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
feiyafei2008 2010-02-20
  • 打赏
  • 举报
回复
太感谢了,新年愉快!
都市夜猫 2010-02-20
  • 打赏
  • 举报
回复
要转成 vfp 的代码有一个问题,就是 EnumChildWindows 这个 api 函数,它的第二个参数需要传入一个回调函数指针,而 vfp 是不存在函数指针的,简单的解决方法有两种:
1. 改用 FindWindowEx api 函数,并自己写循环,遍历所有子窗口,检测子窗口类名
2. 使用 vfp2c32.fll 中的 CreateCallbackFunc 函数来得到回调函数地址,vfp2c32 可以到 http://vfp2c.dyndns.org/ 去下载,附带的示例中就有一个使用回调函数调用 EnumWindows api 函数的示例,我的 blog 中也有一篇生成简版 vfp2c32.fll 的文章可参考。

假设你已经用上面两种方法之一得到了这个 Internet Explorer_Server 窗口的句柄 hWnd(或者为验证转换后的代码直接用 spy++ 取得窗口句柄),则剩下转换就简单了,例如:

m.hWnd = INPUTBOX('Internet Explorer_Server 窗口句柄:')
m.hWnd = EVALUATE(EVL(m.hWnd, '0'))

DECLARE Long RegisterWindowMessage IN WIN32API String
DECLARE Long SendMessageTimeout IN WIN32API Long,Long,Long,Long,Long,Long,Long @
DECLARE Long ObjectFromLresult IN oleacc Long,String,Long,Object @

m.lnMsg = RegisterWindowMessage("WM_HTML_GETOBJECT")
m.lnRes = 0
SendMessageTimeout(m.hWnd, m.lnMsg, 0, 0, 2, 1000, @ m.lnRes)
IF m.lnRes > 0
m.lcIID = BINTOC(0x626FC520, '4rs') ; && data1
+ LEFT(BINTOC(0xA41E, '4rs'), 2) ; && data2
+ BINTOC(0x11CF, '2rs') ; && data3
+ 0hA73100A0C9082637 && data4
m.oo = NULL && HTMLDocument 对象
ObjectFromLresult(m.lnRes, m.lcIID, 0, @ m.oo)
* 下面就是简单的使用对象属性了,还记得 oo 加点看 com 对象的属性/方法吧
* SET STEP ON
* oo.
* 你熟悉 html,对你来说很简单,例如:
CLEAR
? oo.location.href && url
? oo.body.document.title && 标题
WAIT ''
? oo.body.innerHTML && HTML 内容
WAIT ''
? oo.body.innerTEXT && 页面文本
ELSE
MESSAGEBOX('窗口句柄错误。')
ENDIF


feiyafei2008 2010-02-19
  • 打赏
  • 举报
回复
问题解决了,但上面这一段VB代码不知道如何转成VFP的。

我现在的思路是,用VB做了一个ActiveX Dll 的类可以获取IE控件内的内容。
用VFP调用该组件, createobject 这样已可以实现。
发帖
VFP

2573

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
帖子事件
创建了帖子
2010-02-18 03:46
社区公告
暂无公告