在C#中访问IE Dom进程

时间:2011-03-10 03:38:12

标签: c# oop internet-explorer dom

有没有办法在进程外访问IE DOM,例如网页抓取器加载当前显示的页面并抓取数据。我已经看到了几种下载页面并进行处理的方法,但是当网站回馈动态结果并需要登录时,这种方法无效。

我希望不必写一个bho来访问数据并通过wcf共享它。我已经看到了一些使用c ++和msaa服务器获取数据的例子,但这并没有真正帮助我获取它,因为我不想使用C ++帮助器,因为我多年没有使用过c ++。

TIA。

2 个答案:

答案 0 :(得分:2)

根据您需要做多少事情,您可能需要考虑使用像WatiN这样的简单内容。它是实例化浏览器实例和遍历树的绝佳工具。 DOM操作非常简单,并且有很好的文档记录(网上有很多例子)。

答案 1 :(得分:1)

如果您只是在进行抓取和请求,那么最好使用.NET附带的WebRequest对象来完成您的工作。

WebRequest Class @ MSDN

但是,如果您必须具有对IE DOM中表示的内容的准确访问权限,则应使用Microsoft Active Accessibility获取访问权限。如果您可以识别目标IE窗口的窗口句柄或可靠位置,并且它在用户会话中可见,则Active Accessibility是访问目标IE窗口并深入DOM的最佳方式。使用C ++并不是绝对必要的,但在C ++中完成大部分操作可能会更容易。

Active Accessibility User Interface Services @ MSDN

您将希望使用EnumChildWindows从桌面或从枚举进程检索到的框架窗口的句柄中定位(或强制查询)DOM窗口。在.NET中,可以从System.Process类中获取进程的枚举。

EnumChildWindows @ MSDN

EnumWindows signature @ pinvoke.net
EnumChildWindows signature @ pinvoke.net

Process.GetProcesses() @ MSDN
Process.MainWindowHandle @ MSDN

要添加类型声明,您需要能够在C#中遍历DOM并与MSAA交谈,向项目添加“Microsoft HTML Object Library”的COM引用,并为MSAA添加P / Invoke签名。 / p>

AccessibleObjectFromWindow Signature @ pinvoke.net

一旦你可以调用MSAA,从窗口句柄通过Active Accessibility检索IDispatch。您需要发送OBJID_NATIVEOM,这将为您提供IDispatch您可以查询的内容。

Retrieving an IAccessible Object @ MSDN
AccessibleObjectFromWindow() @ MSDN

从这里开始,IDispatch可以转换为IHTMLWindow2IHTMLDocument2(以及派生词),其中包含所有DOM脚本模型方法等。不幸的是我不记得通过这种方法返回了哪一个,但无论如何,IHTMLWindow2具有document属性(与脚本中的window.document相同)。可以解析为提供对DOM的访问,DOM由IHTMLDocument2和所有派生接口表示。