如何从 HWND 得到 IWebBrowser2 的指针

roger_ding 2003-08-08 11:49:51
已知可以从 “Internet Explorer_Server” 得到 IHTMLDocument2 interface,
那么已知“Shell Embedding”的HWND,怎么得到 IWebBrowser2 interface 呢?
注:IWebBrowser2 刚初始化,还没有 Call Navigate(...),所以没有子窗口!
...全文
331 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2003-08-14
  • 打赏
  • 举报
回复
Knowledge Base
Q192501 FIX: IDocHostUIHandler Not Queried for CLSID_WebBrowser_V1
说一下,Shell Embedding只是顶层的WebBrowser2的窗口,参见MSDNMAG200109 C++Q&A
另外,如果你独立创建文档对象(CoCreateInstance),那么不能从文档对象获得窗口HTMLWindow2和浏览器WebBrowser2对象。
否则,窗口对象和浏览器对象的初始化总是先于文档对象。
roger_ding 2003-08-14
  • 打赏
  • 举报
回复
看来通过HWND得到IWebBrowser2是不可能的事了,
不过我想了一个另类的方法:
告诉用户这个窗口不合格,关掉再开个新的!!!:)

看来我今晚只能去比尔家窃点资料了:)
roger_ding 2003-08-10
  • 打赏
  • 举报
回复
谢谢microran2000()的提醒!我又看了你的代码。
正如你自己说的,“得到IE活动窗口句柄,然后利用句柄通过OLEACC.DLL的输出函数ObjectFromLresult,得到IHTMLDocument2”,
是先得到IHTMLDocument2,然后才得到IWebBrowser2!

在正常的IE开启后,会有以下的窗口树:
Internet Explorer_Server
Shell DocObject View
IEFrame

若是多线程浏览器,则会是以下的窗口树:
Internet Explorer_Server
Shell DocObject View
Shell Embedding

其实它们分别对应三个interface
IHTMLDocument2
IHTMLWindow2
IWebBrowser2

在我的题目里IWebBrowser2还没有初始化,所以没有“Internet Explorer_Server”和“Shell DocObject View”这两个窗口,因此得不到IHTMLDocument2。
所以我想从(而且也只能从)“Shell Embedding”来得到IWebBrowser2的interface。
这个双休日我都耗在这上面了,还没头绪!郁闷中...
microran2000 2003-08-10
  • 打赏
  • 举报
回复
TO roger_ding(海天一色) ( )
你没有看懂这段代码,这段在代码我一直使用着,他是IEAssistant中的一段代码。在窗口右击有时我不想从脚本中得到URL,于是就是直接调用这个函数得到IE活动窗口句柄,然后利用句柄通过OLEACC.DLL的输出函数ObjectFromLresult,得到IHTMLDocument2,然后通过它反查IWebBrowser2。
其实该代码源自察看网页密码的程序。
即通过鼠标位置,察看网页中的密码。
nhwxkywhg 2003-08-10
  • 打赏
  • 举报
回复
HWND hw;//=(HWND)0x000601D8;
MSHTML::IHTMLDocument2Ptr doc;
MSHTML::IHTMLElementCollectionPtr col;
MSHTML::IHTMLElementPtr EL;
DWORD lRes;
HRESULT hres;
/*
HINSTANCE hInst=LoadLibrary('Oleacc.dll');
GetProcAddress(hInst,"ObjectFromLresult");
*/
int cs=m_list.GetCurSel();
if(cs!=-1)
{
FINDWINDOWHANDLESTRUCT *fs=(FINDWINDOWHANDLESTRUCT *)m_list.GetItemData(cs);
hw=fs->hWndFound;
}
else return;


UINT MSG = RegisterWindowMessage("WM_HTML_GETOBJECT");
SendMessageTimeout(hw, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, &lRes);

hres=ObjectFromLresult(lRes,__uuidof(MSHTML::IHTMLDocument2),0,(void**)&doc);

if(hres==S_OK) {

doc->get_all(&col);
long l;
col->get_length(&l);
_variant_t v1,v2;
v1=(long)0;
v2=(long)0;
EL=col->item(v1,v2);
CString a;
_bstr_t bst=EL->GetinnerHTML();
a=(char *)bst;
FILE *f=fopen("data_from_explorer.txt","w");
fwrite((char *)bst,1,a.GetLength(),f);
fclose(f);
AfxMessageBox("Saved in data_from_explorer.txt");
}

microran2000 2003-08-09
  • 打赏
  • 举报
回复
IWebBrowser2* GetIEFromWnd(HWND hIEWindow)
{ HWND hWnd ;
if(hIEWindow==NULL){
hWnd= FindWindow("IEFrame", NULL);
if(hWnd==NULL)
hWnd= FindWindow("CabinetWClass", NULL);
if( hWnd == NULL){
MessageBox (NULL,"No Running instance of Internet Explorer!","message", MB_OK);
}
// walk Shell DocObject View->Internet Explorer_Server
HWND hWndChild = FindWindowEx(hWnd, 0, "Shell DocObject View", NULL);
if(hWndChild !=0){
hWndChild = FindWindowEx(hWndChild, 0, "Internet Explorer_Server", NULL);
}
hWnd=hWndChild;
}
else{
hWnd=hIEWindow;
}
// ÎÒÃÇÐèÒªÏÔʾµØ×°ÔØOLEACC.DLL,ÕâÑùÎÒÃDzÅÖªµÀÓÐûÓа²×°MSAA
HINSTANCE hInst = LoadLibrary( _T("OLEACC.DLL") );
IWebBrowser2* pWebBrowser2=NULL;
if ( hInst != NULL ){
if ( hWnd != NULL ){

LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL ){
HRESULT hr;
CComPtr<IHTMLDocument2>spDoc;

hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
if ( SUCCEEDED(hr) ){

CComPtr<IHTMLWindow2>spWnd2;
CComPtr<IServiceProvider>spServiceProv;
hr=spDoc->get_parentWindow ((IHTMLWindow2**)&spWnd2);
if(SUCCEEDED(hr)){

hr=spWnd2->QueryInterface (IID_IServiceProvider,(void**)&spServiceProv);
if(SUCCEEDED(hr)){
hr = spServiceProv->QueryService(SID_SWebBrowserApp,
IID_IWebBrowser2,
(void**)&pWebBrowser2);


}
}
}

}
}

::FreeLibrary(hInst);
}
else{//Èç¹ûûÓа²×°MSAA
MessageBox(NULL,_T("Please Install Microsoft Active Accessibility"),"Error",MB_OK);
}
return pWebBrowser2;
}
roger_ding 2003-08-09
  • 打赏
  • 举报
回复
谢过microran2000()

可是在该代码里仍然是通过IID_IHTMLDocument2来间接得到IWebBrowser2的interface,

hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
hr=spDoc->get_parentWindow ((IHTMLWindow2**)&spWnd2);

因为IWebBrowser2还没有初始化,所以不存在IHTMLDocument2 interface,因此必须直接
从HWND得到IWebBrowser2 interface。
这两天搞得头都大了,还是没有头绪!!!
roger_ding 2003-08-08
  • 打赏
  • 举报
回复
sorry, 我没说清楚,所有的 HWND 都是在别的进程中的,
通过 RegisterWindowMessage 可以得到其他进程中 HWND 的 IHTMLDocument2 interface,
但 IWebBrowser2 interface (from “Shell Embedding”HWND) 怎么得呢?
有高手知道吗?
henryzc 2003-08-08
  • 打赏
  • 举报
回复
up,gz,study
ray428 2003-08-08
  • 打赏
  • 举报
回复
你可以建立一个IWebBrowser2事例:
比如在头文件里定义:IWebBrowser2 m_WebBrowser2;
这样要用的时候只要得到m_WebBrowser2就可以了!

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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