如何获得外部程序的TWebBrowser中的内容?

FigoZhu 2009-07-10 11:04:00
有一个程序内的TWebBrowser访问了一个页面,但是,这个页面右击无效。
抓包得到的访问URL,在IE中输入无法访问,是不是有cookie之类的?

那么,如何获得外部程序的TWebBrowser中的内容?
...全文
71 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
FigoZhu 2009-07-10
  • 打赏
  • 举报
回复
太棒了,回去就试试。
科多兽 2009-07-10
  • 打赏
  • 举报
回复
妖哥,你好强.
ccrun.com 2009-07-10
  • 打赏
  • 举报
回复
以上代码中需要特别注意的一些地方:
1. CrnFindWebBrowserHandle函数中,查找WebBrowser窗口句柄时,如果窗体上有多个嵌套窗口或者有多个同类名的兄弟窗口,就要配合GetWindow等其他API来找到真正需要的那个窗口。该函数中的代码,仅适用于这个示例中的窗口结构。
2. CrnGetDocInterfaceFromHandle函数中,有时可能获取IHTMLDocument2接口会失败。可能适当加一些延时代码会效果更好。
ccrun.com 2009-07-10
  • 打赏
  • 举报
回复
先打开Delphi,创建一个新工程,拖一个WebBrowser和一个Button在窗体,更改Form的Name为FormAAA,然后在按钮的点击事件中:
procedure TFormAAA.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('www.ccrun.com');
end;

注意这里我用Delphi创建工程,只是为了方便调试,同时打开Delphi和C++Builder互相不受什么影响。用C++Builder创建也可以。

打开C++Builder,创建新工程,拖一个Memo和一个Button在窗体,然后添加以下代码:
#include <mshtml.h>
#include <oleacc.h>
#include <atl\atlbase.h>

//---------------------------------------------------------------------------
// 从WebBrowser窗口获取IHTMLDocument2接口
IHTMLDocument2 *CrnGetDocInterfaceFromHandle(HANDLE hWnd)
{
if (hWnd == NULL || !IsWindow(hWnd))
return NULL;

IHTMLDocument2 *spDoc = NULL;
HINSTANCE hInst = ::LoadLibrary(TEXT("OLEACC.DLL"));
if (hInst)
{
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT"));
::SendMessageTimeout(hWnd, nMsg, 0L, 0L,
SMTO_ABORTIFHUNG, 10, (DWORD *)&lRes);
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)
::GetProcAddress(hInst, TEXT("ObjectFromLresult"));
if (pfObjectFromLresult != NULL)
{
HRESULT hr = (*pfObjectFromLresult)
(lRes, IID_IHTMLDocument, 0, (void**)&spDoc);
if (SUCCEEDED(hr))
{
IDispatch *pDisp;
IHTMLWindow2 *pWin;
spDoc->get_Script(&pDisp);
pDisp->QueryInterface(IID_IHTMLWindow2, (void **)&pWin);
pDisp->Release();
pWin->get_document(&spDoc);
pWin->Release();
}
}
::FreeLibrary(hInst);
}
return spDoc;
}
//---------------------------------------------------------------------------
// 查找指定窗口中的WebBrowser窗口句柄
HWND CrnFindWebBrowserHandle()
{
// 注意FindWindow中指定的类名和窗口标题,这里仅仅是演示
HWND hTopWnd = ::FindWindow(TEXT("TFormAAA"), TEXT("FormAAA"));
HWND hChildWnd = NULL;

if (hTopWnd && ::IsWindow(hTopWnd))
{
// 按层次查找IE页面句柄
hChildWnd = ::FindWindowEx(hTopWnd, NULL, TEXT("Shell Embedding"), TEXT(""));
hChildWnd = ::FindWindowEx(hChildWnd, NULL, TEXT("Shell DocObject View"), TEXT(""));
hChildWnd = ::FindWindowEx(hChildWnd, NULL, TEXT("Internet Explorer_Server"), TEXT(""));
}
return hChildWnd;
}
//---------------------------------------------------------------------------
// 获取HTML页面中Body段的HTML代码
String CrnGetHtmlBodyHtml()
{
String strResult("");

HWND hWnd = CrnFindWebBrowserHandle();
if (::IsWindow(hWnd))
{
IHTMLDocument2 *spDoc = CrnGetDocInterfaceFromHandle(hWnd);
if (spDoc)
{
IHTMLElement *pElement;
wchar_t *wszText;
if (SUCCEEDED(spDoc->get_body(&pElement)))
pElement->get_outerHTML(&wszText);
pElement->Release();

strResult = String(wszText);
}
}
return strResult;
}


在按钮的点击事件中添加以下代码:
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Text = CrnGetHtmlBodyHtml();
}


这样就ok了。

效果图在这里:
ccrun.com 2009-07-10
  • 打赏
  • 举报
回复
好的,我给你写一个简单的示例。
FigoZhu 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ccrun 的回复:]
先通过FindWindow或EnumWindows找到这个外部程序中TWeBrowser所在的顶级窗口,再通过FindWindowEx或EnumChildWindows找到WebBrowser的窗口句柄(类名是"Internet Explorer_Server"),再通过ObjectFromLresult从窗口句柄中获得IHTMLDocument2接口,有了这个接口,获取该页面的内容就很简单了。例如通过get_body获取到HTML页面中Body段的文字,通过遍历IHTMLElementCollection接口取得各元素的内容等等。
[/Quote]

还是妖哥厉害~~~
不过,小弟比较菜。
能稍微给点范例代码吗?
ccrun.com 2009-07-10
  • 打赏
  • 举报
回复
先通过FindWindow或EnumWindows找到这个外部程序中TWeBrowser所在的顶级窗口,再通过FindWindowEx或EnumChildWindows找到WebBrowser的窗口句柄(类名是"Internet Explorer_Server"),再通过ObjectFromLresult从窗口句柄中获得IHTMLDocument2接口,有了这个接口,获取该页面的内容就很简单了。例如通过get_body获取到HTML页面中Body段的文字,通过遍历IHTMLElementCollection接口取得各元素的内容等等。

602

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧