社区
HTML/XML
帖子详情
如何从 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
打赏
收藏
如何从 HWND 得到 IWebBrowser2 的指针
已知可以从 “Internet Explorer_Server” 得到 IHTMLDocument2 interface, 那么已知“Shell Embedding”的HWND,怎么得到 IWebBrowser2 interface 呢? 注:IWebBrowser2 刚初始化,还没有 Call Navigate(...),所以没有子窗口!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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就可以了!
获取I
Web
Browser
2
指针
的方法(一)
获取I
Web
Browser
2
指针
的方法
获取I
Web
Browser
2
指针
的两种方法
在Internet Explorer编程中,获取
Web
Browser
指针
通常是一件很重要的事情,因为有了
Web
Browser
指针
,我们就有了对IE完整的控制权。我们就可以对IE浏览器为所欲为了,想干什么都可以。比方说获取或者设置DOM控件的值。调用页面中的JavaScript,或者控制浏览器的行为 比方说刷新,前进、后退等等等等。 下面两篇文章中,我将介绍两种方法来获取I
Web
Browse...
获取I
Web
Browser
2
指针
的方法
版权声明请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。 在Internet Explorer编程中,获取
Web
Browser
指针
通常是一件很重要的事情,因为有了
Web
Browser
指针
,我们就有了对IE完整的控制权。我们就可以对IE浏览器为所欲为了,想干什么都可以。比方说获取或者设置DOM控件的值。调用页面中的Ja...
cocos2d-x win32平台嵌入浏览器—I
Web
Browser
2的使用
这一篇暂时不会涉及到cocos2d-x的内容,z
使用I
Web
Browser
2操控浏览器页面测试(IE)
测试一下在IE浏览器界面中插入代码测试,采用寻找窗口的方式获取Internet Explorer_Server句柄。 写的时候参考了很多网上的资料,有些地方不大适用就稍微修改了一下。 SendMessageTimeout函数一直无效(看网上有一回答说c#可以正常使用,没试过),无效情况是执行成功(非超时),但是lpRes为0,于是改用SendMessage; 使用spyxx查...
HTML/XML
3,055
社区成员
8,066
社区内容
发帖
与我相关
我的任务
HTML/XML
VC/MFC HTML/XML
复制链接
扫一扫
分享
社区描述
VC/MFC HTML/XML
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章