当前位置: 首页 > news >正文

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

如何让网页上的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):
//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);

相关文章:

  • 难道冬泳都会断子绝孙?
  • pdf转word软件
  • 优酷视频下载器 优酷视频下载方法
  • LeetCode: Surrounded Regions [130]
  • 常用中文字体
  • 2016 - 1 - 23 json转模型 常用的第三方框架
  • 常用英文字体收集备用
  • 80后的我,碌碌无为的22年
  • MongoDb的安装
  • 读书笔记 - 《格鲁夫给经理人的第一课》
  • 用Delphi制作DLL的方法
  • poj 2769 Reduced ID Numbers(memset使用技巧)
  • 2010 - 2011
  • CSS实现强制换行-------Day 78
  • Machine Learning #Lab1# Linear Regression
  • 【附node操作实例】redis简明入门系列—字符串类型
  • interface和setter,getter
  • JavaScript-Array类型
  • Python 反序列化安全问题(二)
  • SpringBoot 实战 (三) | 配置文件详解
  • vue中实现单选
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 看域名解析域名安全对SEO的影响
  • 力扣(LeetCode)22
  • 七牛云假注销小指南
  • 如何设计一个微型分布式架构?
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 智能合约Solidity教程-事件和日志(一)
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​ssh免密码登录设置及问题总结
  • #HarmonyOS:基础语法
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Java数据结构)ArrayList
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (离散数学)逻辑连接词
  • (七)Java对象在Hibernate持久化层的状态
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十) 初识 Docker file
  • (五)Python 垃圾回收机制
  • *Django中的Ajax 纯js的书写样式1
  • .form文件_一篇文章学会文件上传
  • .Net Core 中间件验签
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET MVC 验证码
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @AutoConfigurationPackage的使用
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20170728]oracle保留字.txt