首页 新闻 搜索 专区 学院

C+IE 小窗口播放FLASH的功能,谁能帮翻译成C#。

0
悬赏园豆:10 [已解决问题] 解决于 2017-07-04 12:04

其实有一个简单的办法,那就是把页面里的Flash控件重新激活到另一个窗口上。因为我们知道,Flash其实是一个ActiveX控件,运行在IE容器里。如果我们创建一个新的Ole Container,就可以把Flash控件激活到新的Container里。这样,Flash控件就可以在保持状态的情况下在不同的容器之间转换,既自由的在页面和弹出窗口中切换。
所以,要弹出(IE)页面里的Flash视频,需要以下几步:

 
1.  通过Web Browser控件或者BHO,在页面加载完成后得到页面的DOM模型,找到Embed节点对象,即可查到Flash空间。

 
2.  创建Ole容器,比如ATL的CAxWindow

 
3.  激活Flash控件到新的Ole容器



代码片段(基于ATL):
//pFlashDisp为Flash控件对象,通过分析页面DOM获得

//保存IE容器,用于恢复
CComQIPtr<IOleObject> spFlashOleObj = pFlashDisp;
spFlashOleObj->GetClientSite(&m_spIESite);

//必选先关闭,才能转移到新的窗口上
spFlashOleObj->DoVerb(OLEIVERB_HIDE, NULL, m_spIESite, 0, NULL, NULL);
spFlashOleObj->Close(OLECLOSE_NOSAVE);

//创建新的Ole容器(ATL的CAxWindow类)
CRect clientRect;
GetClientRect(&clientRect);
m_HostWin.Create(m_hWnd, &clientRect, NULL, WS_CHILD);

CComPtr<IAxWinHostWindow> spHost;
m_HostWin.QueryHost(&spHost);

//使得Flash可以查询到IE提供的IServiceProvider,比如可以打开新的网页
CComQIPtr<IObjectWithSite> spObjWithSite;
m_HostWin.QueryHost(IID_IObjectWithSite, (void**)&spObjWithSite);
spObjWithSite->SetSite(pOuterSite);

//激活到新容器, m_hWnd为m_HostWin的父窗口
spHost->AttachControl(spFlashOleObj, m_hWnd);

atfeel的主页 atfeel | 初学一级 | 园豆:69
提问于:2016-03-04 12:30
< >
分享
最佳答案
0

激活到新容器, m_hWnd为m_HostWin的父窗口

atfeel | 初学一级 |园豆:69 | 2017-07-04 12:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册