首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

请问有关问题:如何获取Internet Explorer_Server中的内容

2012-03-13 
请教问题:怎么获取Internet Explorer_Server中的内容已经可以获以某个窗口内的子窗口“Internet Explorer_S

请教问题:怎么获取Internet Explorer_Server中的内容
已经可以获以某个窗口内的子窗口“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

[解决办法]
要转成 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


热点排行