在直播项目中 需要捕获某个窗口的画面并共享 总结了如下几种场景中窗口的捕获方法

1、dc拷贝(BitBlt、PrintWindow)

这是最基本的方法 直接拿到窗口dc 然后从dc中拷贝窗口画面 可优先使用PrintWindow 因为该API可以捕获窗口超出桌面范围的区域。需要注意的是,PrintWindow会触发目标窗口执行WM_PAINT,并且执行完毕后才会返回,所以可能造成目标窗口频繁刷新,或调用PrintWindow会耗时,所以不推荐使用这个API。

关键词:GetDC   BitBlt  GetDIBits

2、具有WS_EX_LAYERED属性的窗口

比如酷狗歌词窗口、BigFoot界面(魔兽世界大脚)

这种窗口第一种方法是拿不到画面的(拿到的画面是黑色)

只能通过“dll进程注入+API函数hook”的方法 在hook了的API(UpdateLayeredWindow)的回调函数中

通过参数获取到窗口画面

3、使用OpenGL或D3D渲染的窗口

不少游戏(CS/QQ桌球/英雄联盟)和播放器的界面渲染 就是使用OpenGL或者D3D进行渲染的

与方法2一样 也只能通过“dll进程注入+API函数hook”的方法进行画面捕获

其中OpenGL的hook比较简单 直接hook渲染函数wglSwapBuffers并在回调中解析数据就行了

但是D3D 因为版本太多 针对不同的游戏 需要hook对应的D3D版本:D3D9 D3D10 D3D11 D3D12

针对不同版本的D3D hook对应的渲染函数 实现起来工作量相对较多

禁用Aero

不过针对WIN7及以下版本的系统 如果非要捕获这类窗口 也可以采用禁用Aero的方式(具体请参考函数DwmEnableComposition)

OBS就实现了这种方法(在obs的高级设置中会有是否禁用Aero的选项)  但是这种方法会有两个弊端:

a、调用API禁用或恢复玻璃效果时 整个桌面会黑一下 影响用户体验

b、如果有其他窗口遮挡 捕获的画面会有问题:会将遮挡窗口的画面也捕获进去

屏幕dc

不过个人觉得 采用禁用Aero的方法 还不如直接用屏幕dc的方式实现

与方法1相似 不过创建dc的时候 不是创建游戏窗口的dc 而是创建一个屏幕dc 之后截取游戏在屏幕对应区域的dc数据 即可捕获到游戏画面

不过这种方法与禁用Aero一样 如果有别的窗口遮挡游戏画面 捕获的画面就不对 所以必须要求待捕获的窗口在最前端

4、硬件加速的窗口

测试项目时发现 WIN10中chrome界面一直无法捕获 (拿到的画面是黑色)调查发现其并没有使用openGL或者d3d渲染界面(进程中没有加载这些dll)

打开设置界面后 发现有一个硬件加速的选项 取消后 再按照方法1进行捕获 画面就正常了

(这类窗口具体无法捕获的原因 我也暂时还不清楚)

---------------------------------------------------------------------------------------------------------

方法2和3中提到了“dll进程注入+API函数hook”

其中dll注入的方法有两种:创建远端线程(CreateRemoteThread)、采用钩子注入(SetWindowsHookEx)

API函数hook的方法有两种:修改函数跳转地址、修改虚函数表

若干种窗口画面的捕获方法相关推荐

  1. 【论文翻译】在不同数据结构中实现变更数据捕获方法以支持实时数据仓库的实验结果

    文章目录 在不同数据结构中实现变更数据捕获方法以支持实时数据仓库的实验结果 1 引言 2 相关工作 3 方法论 3.1 数据来源 3.2 变更数据捕获方法 4 分析和设计 4.1 环境准备 4.2 变 ...

  2. golang string 加号连接性能慢_面试必备:浅析C#性能优化的若干种方法

    浅析C#性能优化的若干种方法 1.1 垃圾回收 垃圾回收解放了手工管理对象的工作,提高了程序的健壮性,但副作用就是程序代码可能对于对象创建变得随意. 1.1.1 避免不必要的对象创建 由于垃圾回收的代 ...

  3. 用python下载文件的若干种方法汇总

    压缩文件可以直接放到下载器里面下载的 you-get 连接 下载任意文件 重点 用python下载文件的若干种方法汇总 写文章 用python下载文件的若干种方法汇总 zhangqibot发表于Met ...

  4. jquery读取json文件跨域_跨域方法的若干种方式

    一.跨域的解释 那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制, a.com 域名下的js无法操作 b.com 或是 c.a.com 域名下的对象.当协议.子域名.主域名.端口号 ...

  5. python 下载文件-用python下载文件的若干种方法汇总

    在日常科研或者工作中,我们免不了要批量从网上下载一些资料.要是手工一个个去下载,浪费时间又让鼠标折寿,好不容易点完了发现手指都麻木了. 这种重复性的批量作业我们应该交给python小弟去帮我们搞定,这 ...

  6. html中如何在页面底部增加,HTML中footer固定在页面底部的若干种方法

    如果主体内容过短不足以支撑浏览器时,footer会上移,非常影响页面,算是一个大bug了,搜过很多种方法现整理一下footer固定在第的若干种方法,供以后参考.(欢迎大家积极补充.) 以上布局为给个人 ...

  7. msk 频偏_一种直扩MSK信号的二维联合捕获方法

    0 引言 目前,扩频技术多基于BPSK/QPSK调制方式,在存在严重非线性失真.多普勒频移与多径衰落的场合中,直扩BPSK/QPSK系统将无法适用.直扩MSK信号结合了扩频系统的低截获性.多用户随机选 ...

  8. 怎么抓取计算机窗口,又学会了一种黑别人电脑的方法——如何在登录界面获取shell...

    原标题:又学会了一种黑别人电脑的方法--如何在登录界面获取shell 首先 小编谨代表漏洞银行 欢迎刚加入行长叠报的一大波小可爱 最近 小编也在积极组织活动 为大家辞旧迎新做准备 还有三天就到2018 ...

  9. 安卓把word转为html,把Word转为简洁的html的若干种方法

    word可以直接另存为 htm,但即使是 另存为 html 也会有大量的废代码.以前我一般用 dreamweaver 的 clean up html 来处理,先处理 word 特有标签,然后删除一些 ...

最新文章

  1. 25CSS3中的3D转换
  2. python怎么学最快-怎么样快速高效学习Python
  3. 分布式数据库中间件Mycat百亿级数据存储(转)
  4. C#线程使用(二)全面总结
  5. python操作excel表格写入多行和多列_python多处理:写入同一excel-fi
  6. 面试风云录(01) - 怎样回答这两个问题?
  7. 《目标检测》YOLO、SSD简单学习
  8. 速度是 macOS 的两倍?首个支持 M1 Mac 的 Linux 发行版终于出现
  9. float和position
  10. python自动化办公教程百度云-693629 用Python自动办公,做职场高手(完结)
  11. centos linux 通过yum安装nginx
  12. 面试没过的程序员都到哪去了?
  13. Python替换多个tomcat端口号
  14. HCIE大师之路(六)——BGP路由综合实验
  15. android cardview,安卓 CardView 妙用
  16. 高科技口罩可以5分钟内灭活新冠病毒;华伦天奴美妆全线产品将登陆中国市场 | 美通企业日报...
  17. 程序员需要建立的对技术、业务、行业、管理、投资的认知
  18. java unbox_Java ValueConversions.unbox方法代码示例
  19. 从技术原理解析区块链为何列入新基建
  20. wifi设备名称android,Android设置WiFi设备名解析

热门文章

  1. 4.Redis最佳实践
  2. Striving For Simplicity-the All Convolutional Net 笔记
  3. python里random是什么意思_import random函数 python中random什么意思
  4. poi简介与简单使用
  5. 爬虫软件在我们网站数据采集中起什么作用
  6. setTimeout 深度剖析
  7. 【Java 数据结构】双向链表
  8. ria开发_使用Adobe Flash Platform构建RIA
  9. Linux下编辑处理数理化公式(转)
  10. 笔记本usb2.0不可用,usb3.0正常