如何让网页上的Flash视频在弹出窗口中播放

 
很多浏览器都有这个功能,当你把鼠标移动到网页视频上,就可以看到顶部有一个按钮出现,弹出独立播放器。当你点击按钮,视频就弹出在新窗口播放了,这时候视频窗口的大小可以自由调整不再受页面的限制。

这是如何做到的呢?

首先想到的是,浏览器缩放缩放了页面的大小,正好可以显示视频窗口的大小。好像火狐有一个魔镜功能,可以实现网页简报既截取网页任意部分。 要做到这点,浏览器的外框程序必须是自己写的(国内的浏览器都是这样的)。如果浏览器不是自己的,能不能通过BHO来实现呢?

另一个想法是,把页面里视频相关的HTML代码提取出来,然后在一个新页面框架里显示。但是这样的话,就必须对页面代码的结构非常熟悉,而且必须跟随变化。还有,当新视频窗口弹出时,播放进度是不能保持的,必须重头播放。


其实有一个简单的办法,那就是把页面里的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):


Cpp代码 复制代码  收藏代码
  1. //pFlashDisp为Flash控件对象,通过分析页面DOM获得   
  2.   
  3. //保存IE容器,用于恢复   
  4. CComQIPtr<IOleObject> spFlashOleObj = pFlashDisp;   
  5. spFlashOleObj->GetClientSite(&m_spIESite);   
  6.   
  7. //必选先关闭,才能转移到新的窗口上   
  8. spFlashOleObj->DoVerb(OLEIVERB_HIDE, NULL, m_spIESite, 0, NULL, NULL);   
  9. spFlashOleObj->Close(OLECLOSE_NOSAVE);   
  10.   
  11.   
  12. //创建新的Ole容器(ATL的CAxWindow类)   
  13. CRect clientRect;   
  14. GetClientRect(&clientRect);   
  15. m_HostWin.Create(m_hWnd, &clientRect, NULL, WS_CHILD);   
  16.   
  17. CComPtr<IAxWinHostWindow> spHost;   
  18. m_HostWin.QueryHost(&spHost);   
  19.   
  20. //使得Flash可以查询到IE提供的IServiceProvider,比如可以打开新的网页   
  21. CComQIPtr<IObjectWithSite> spObjWithSite;   
  22. m_HostWin.QueryHost(IID_IObjectWithSite, (void**)&spObjWithSite);   
  23. spObjWithSite->SetSite(pOuterSite);   
  24.   
  25. //激活到新容器, m_hWnd为m_HostWin的父窗口   
  26. spHost->AttachControl(spFlashOleObj, m_hWnd);  
//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);
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值