.NET Compact FrameWork 下的WebBrowser 获取他的IHtmlDocument接口

从一开始到找出来花了我几天的时间.

首先,我是在CE下开发的,就连找WebBrowser的控件也花了我些时间,就是在EVC的支持下用,因为EVC可以生成调用该控件的源码.

获得了之后,就开始了解WebBrowser的相关接口,即接口查询,接口关系,因为我只是想操作其滚动条,所以只需找到IHtmlWindow接口即可. 虽然我不清楚为什么,在CF里没有对WebBrowser的Document的引用,那么,就只能用EVC来操作其接口了,为什么CF里要把Document对象封装起来呢?有谁可以告诉我..我也不清楚.  

即然EVC可以操作,那就是解决如何在C#里创建EVC控件了,或许说只是用C#来调用EVC的控件创建,而具体操作是由EVC来操作,当然这也是要通过DLL来完成的..

就这个在DLL里创建COM控件就搞了一天,原来就两个初始化就行了:

AfxOleInit();
 AfxEnableControlContainer(); 

具体我也不太清楚,大概看了下CreateControl的源码,好像有泄及到Container这东西.

可以创建COM了,那问题也差不多全解决了.

在CF里用EVC来创建控件? 其实也简单,只是把相应的句柄传过去,再用CWnd 绑定到该句柄,你就可以把该CWnd当成主窗口一样操作了,是不是很简单.

下面是WebBrowser 用EVC生成的控件引用[WinCe下的]:

//CWebBrowser2.h

#pragma once

#if !defined(AFX_WEBBROWSER2_H__FC8DB34A_76B7_452C_AB66_6C3DEC81875F__INCLUDED_)
#define AFX_WEBBROWSER2_H__FC8DB34A_76B7_452C_AB66_6C3DEC81875F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file.  If this class is regenerated by
//  Microsoft Visual C++, your modifications will be overwritten.

/
// CWebBrowser2 wrapper class

class CWebBrowser2 : public CWnd
{
protected:
 DECLARE_DYNCREATE(CWebBrowser2)
public:
 CLSID const& GetClsid()
 {
  static CLSID const clsid
   = { 0x8856f961, 0x340a, 0x11d0, { 0xa9, 0x6b, 0x0, 0xc0, 0x4f, 0xd7, 0x5, 0xa2 } };
  return clsid;
 }
 virtual BOOL Create(LPCTSTR lpszClassName,
  LPCTSTR lpszWindowName, DWORD dwStyle,
  const RECT& rect,
  CWnd* pParentWnd, UINT nID,
  CCreateContext* pContext = NULL)
 { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }

 BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
  const RECT& rect, CWnd* pParentWnd, UINT nID,
  CFile* pPersist = NULL, BOOL bStorage = FALSE,
  BSTR bstrLicKey = NULL)
 { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
 pPersist, bStorage, bstrLicKey); }

 // Attributes
public:

 // Operations
public:
 void GoBack();
 void GoForward();
 void GoHome();
 void GoSearch();
 void Navigate(LPCTSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers);
 void Refresh();
 void Refresh2(VARIANT* Level);
 void Stop();
 LPDISPATCH GetApplication();
 LPDISPATCH GetParent();
 LPDISPATCH GetContainer();
 LPDISPATCH GetDocument();
 BOOL GetTopLevelContainer();
 CString GetType();
 long GetLeft();
 void SetLeft(long nNewValue);
 long GetTop();
 void SetTop(long nNewValue);
 long GetWidth();
 void SetWidth(long nNewValue);
 long GetHeight();
 void SetHeight(long nNewValue);
 CString GetLocationName();
 CString GetLocationURL();
 BOOL GetBusy();
 void Quit();
 void ClientToWindow(long* pcx, long* pcy);
 void PutProperty(LPCTSTR Property_, const VARIANT& vtValue);
 VARIANT GetProperty_(LPCTSTR Property_);
 CString GetName();
 long GetHwnd();
 CString GetFullName();
 CString GetPath();
 BOOL GetVisible();
 void SetVisible(BOOL bNewValue);
 BOOL GetStatusBar();
 void SetStatusBar(BOOL bNewValue);
 CString GetStatusText();
 void SetStatusText(LPCTSTR lpszNewValue);
 long GetToolBar();
 void SetToolBar(long nNewValue);
 BOOL GetMenuBar();
 void SetMenuBar(BOOL bNewValue);
 BOOL GetFullScreen();
 void SetFullScreen(BOOL bNewValue);
 void Navigate2(VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers);
 long QueryStatusWB(long cmdID);
 void ExecWB(long cmdID, long cmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut);
 void ShowBrowserBar(VARIANT* pvaClsid, VARIANT* pvarShow, VARIANT* pvarSize);
 long GetReadyState();
 BOOL GetOffline();
 void SetOffline(BOOL bNewValue);
 BOOL GetSilent();
 void SetSilent(BOOL bNewValue);
 BOOL GetRegisterAsBrowser();
 void SetRegisterAsBrowser(BOOL bNewValue);
 BOOL GetRegisterAsDropTarget();
 void SetRegisterAsDropTarget(BOOL bNewValue);
 BOOL GetTheaterMode();
 void SetTheaterMode(BOOL bNewValue);
 BOOL GetAddressBar();
 void SetAddressBar(BOOL bNewValue);
 BOOL GetResizable();
 void SetResizable(BOOL bNewValue);
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_WEBBROWSER2_H__FC8DB34A_76B7_452C_AB66_6C3DEC81875F__INCLUDED_)

//CWebBrowser2.cpp

// WebBrowser2.cpp : 实现文件
//

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file.  If this class is regenerated by
//  Microsoft Visual C++, your modifications will be overwritten.


#include "stdafx.h"
#include "WebBrowser2.h"

/
// CWebBrowser2

IMPLEMENT_DYNCREATE(CWebBrowser2, CWnd)

/
// CWebBrowser2 properties

/
// CWebBrowser2 operations

void CWebBrowser2::GoBack()
{
 InvokeHelper(0x64, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::GoForward()
{
 InvokeHelper(0x65, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::GoHome()
{
 InvokeHelper(0x66, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::GoSearch()
{
 InvokeHelper(0x67, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::Navigate(LPCTSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers)
{
 static BYTE parms[] =
  VTS_BSTR VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT;
 InvokeHelper(0x68, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
  URL, Flags, TargetFrameName, PostData, Headers);
}

void CWebBrowser2::Refresh()
{
 InvokeHelper(DISPID_REFRESH, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::Refresh2(VARIANT* Level)
{
 static BYTE parms[] =
  VTS_PVARIANT;
 InvokeHelper(0x69, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
  Level);
}

void CWebBrowser2::Stop()
{
 InvokeHelper(0x6a, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

LPDISPATCH CWebBrowser2::GetApplication()
{
 LPDISPATCH result;
 InvokeHelper(0xc8, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
 return result;
}

LPDISPATCH CWebBrowser2::GetParent()
{
 LPDISPATCH result;
 InvokeHelper(0xc9, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
 return result;
}

LPDISPATCH CWebBrowser2::GetContainer()
{
 LPDISPATCH result;
 InvokeHelper(0xca, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
 return result;
}

LPDISPATCH CWebBrowser2::GetDocument()
{
 LPDISPATCH result;
 InvokeHelper(0xcb, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
 return result;
}

BOOL CWebBrowser2::GetTopLevelContainer()
{
 BOOL result;
 InvokeHelper(0xcc, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

CString CWebBrowser2::GetType()
{
 CString result;
 InvokeHelper(0xcd, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
 return result;
}

long CWebBrowser2::GetLeft()
{
 long result;
 InvokeHelper(0xce, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetLeft(long nNewValue)
{
 static BYTE parms[] =
  VTS_I4;
 InvokeHelper(0xce, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  nNewValue);
}

long CWebBrowser2::GetTop()
{
 long result;
 InvokeHelper(0xcf, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetTop(long nNewValue)
{
 static BYTE parms[] =
  VTS_I4;
 InvokeHelper(0xcf, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  nNewValue);
}

long CWebBrowser2::GetWidth()
{
 long result;
 InvokeHelper(0xd0, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetWidth(long nNewValue)
{
 static BYTE parms[] =
  VTS_I4;
 InvokeHelper(0xd0, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  nNewValue);
}

long CWebBrowser2::GetHeight()
{
 long result;
 InvokeHelper(0xd1, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetHeight(long nNewValue)
{
 static BYTE parms[] =
  VTS_I4;
 InvokeHelper(0xd1, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  nNewValue);
}

CString CWebBrowser2::GetLocationName()
{
 CString result;
 InvokeHelper(0xd2, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
 return result;
}

CString CWebBrowser2::GetLocationURL()
{
 CString result;
 InvokeHelper(0xd3, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
 return result;
}

BOOL CWebBrowser2::GetBusy()
{
 BOOL result;
 InvokeHelper(0xd4, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::Quit()
{
 InvokeHelper(0x12c, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::ClientToWindow(long* pcx, long* pcy)
{
 static BYTE parms[] =
  VTS_PI4 VTS_PI4;
 InvokeHelper(0x12d, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
  pcx, pcy);
}

void CWebBrowser2::PutProperty(LPCTSTR Property_, const VARIANT& vtValue)
{
 static BYTE parms[] =
  VTS_BSTR VTS_VARIANT;
 InvokeHelper(0x12e, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
  Property_, &vtValue);
}

VARIANT CWebBrowser2::GetProperty_(LPCTSTR Property_)
{
 VARIANT result;
 static BYTE parms[] =
  VTS_BSTR;
 InvokeHelper(0x12f, DISPATCH_METHOD, VT_VARIANT, (void*)&result, parms,
  Property_);
 return result;
}

CString CWebBrowser2::GetName()
{
 CString result;
 InvokeHelper(0x0, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
 return result;
}

long CWebBrowser2::GetHwnd()
{
 long result;
 InvokeHelper(DISPID_HWND, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
 return result;
}

CString CWebBrowser2::GetFullName()
{
 CString result;
 InvokeHelper(0x190, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
 return result;
}

CString CWebBrowser2::GetPath()
{
 CString result;
 InvokeHelper(0x191, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
 return result;
}

BOOL CWebBrowser2::GetVisible()
{
 BOOL result;
 InvokeHelper(0x192, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetVisible(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x192, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetStatusBar()
{
 BOOL result;
 InvokeHelper(0x193, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetStatusBar(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x193, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

CString CWebBrowser2::GetStatusText()
{
 CString result;
 InvokeHelper(0x194, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetStatusText(LPCTSTR lpszNewValue)
{
 static BYTE parms[] =
  VTS_BSTR;
 InvokeHelper(0x194, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  lpszNewValue);
}

long CWebBrowser2::GetToolBar()
{
 long result;
 InvokeHelper(0x195, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetToolBar(long nNewValue)
{
 static BYTE parms[] =
  VTS_I4;
 InvokeHelper(0x195, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  nNewValue);
}

BOOL CWebBrowser2::GetMenuBar()
{
 BOOL result;
 InvokeHelper(0x196, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetMenuBar(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x196, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetFullScreen()
{
 BOOL result;
 InvokeHelper(0x197, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetFullScreen(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x197, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

void CWebBrowser2::Navigate2(VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers)
{
 static BYTE parms[] =
  VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT;
 InvokeHelper(0x1f4, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
  URL, Flags, TargetFrameName, PostData, Headers);
}

long CWebBrowser2::QueryStatusWB(long cmdID)
{
 long result;
 static BYTE parms[] =
  VTS_I4;
 InvokeHelper(0x1f5, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
  cmdID);
 return result;
}

void CWebBrowser2::ExecWB(long cmdID, long cmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut)
{
 static BYTE parms[] =
  VTS_I4 VTS_I4 VTS_PVARIANT VTS_PVARIANT;
 InvokeHelper(0x1f6, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
  cmdID, cmdexecopt, pvaIn, pvaOut);
}

void CWebBrowser2::ShowBrowserBar(VARIANT* pvaClsid, VARIANT* pvarShow, VARIANT* pvarSize)
{
 static BYTE parms[] =
  VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT;
 InvokeHelper(0x1f7, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
  pvaClsid, pvarShow, pvarSize);
}

long CWebBrowser2::GetReadyState()
{
 long result;
 InvokeHelper(DISPID_READYSTATE, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
 return result;
}

BOOL CWebBrowser2::GetOffline()
{
 BOOL result;
 InvokeHelper(0x226, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetOffline(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x226, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetSilent()
{
 BOOL result;
 InvokeHelper(0x227, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetSilent(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x227, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetRegisterAsBrowser()
{
 BOOL result;
 InvokeHelper(0x228, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetRegisterAsBrowser(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x228, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetRegisterAsDropTarget()
{
 BOOL result;
 InvokeHelper(0x229, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetRegisterAsDropTarget(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x229, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetTheaterMode()
{
 BOOL result;
 InvokeHelper(0x22a, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetTheaterMode(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x22a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetAddressBar()
{
 BOOL result;
 InvokeHelper(0x22b, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetAddressBar(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x22b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

BOOL CWebBrowser2::GetResizable()
{
 BOOL result;
 InvokeHelper(0x22c, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
 return result;
}

void CWebBrowser2::SetResizable(BOOL bNewValue)
{
 static BYTE parms[] =
  VTS_BOOL;
 InvokeHelper(0x22c, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
  bNewValue);
}

下面就是一些接口的查找和使用了:

//web 就是CWebBrowser的实例

LPDISPATCH pDispach= web->GetDocument();
 HRESULT   hr;
 if (pDispach)
 {
  hr=pDispach->QueryInterface(IID_IHTMLDocument2,(void**)&iDocu);
  if (FAILED(hr))
  {
   AfxMessageBox(_T("IID_IHTMLDocument2查找有错误"));
   return;
  }
  hr=iDocu->get_parentWindow((IHTMLWindow2**)&ieWindow);
  if (FAILED(hr))
  {
   AfxMessageBox(_T("IHTMLWindow2查找有错误"));
   return;
  }
  hr=iDocu->get_body((IHTMLElement**)&iElem);
  if (FAILED(hr))
  {
   AfxMessageBox(_T("IHTMLElement查找有错误"));
   return;
  }
  hr=iElem->QueryInterface(IID_IHTMLBodyElement,(void**)&iBody);
  if (FAILED(hr))
  {
   AfxMessageBox(_T("IID_IHTMLBodyElement查找有错误"));
   return;
  }

//其它的接口定义也就不说了,看了就清楚.接口找到了,想怎么做就怎么做了,只是还需用C#封装多一次罢了.很简单是吧

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值