设为首页收藏本站
查看: 205|回复: 1

[提问] Windows窗口捕获的可行方法?

[复制链接]
  • TA的每日心情
    奋斗
    前天 21:45
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2020-5-23 16:41:39 | 显示全部楼层 |阅读模式
    问题:
    本人想要实现一个兼容windows系统下所有程序的窗口录制接口(对windows的指定窗口进行捕获,获取图形数据),然后利用windows图形设备接口api进行封装实现。但是尝试了GDI,DXGI以及DWM这些接口,都没有完整可以满足我的需求的,希望有这方面经验的大佬可以给点方向或者建议或者实现该功能的开源项目,让我有个方向去研究

    具体情况:
    对于需求的实现,我已经在百度上以及MSDN(微软技术官方文档)查阅了许多资料,利用windows API与C++实现了demo,进行验证

    验证结果:
    GDI
    GDI 可以实现部分窗口程序的截图,但是有一些程序是无法获取其窗口图形数据
    GDI接口是通过windows窗口句柄进行创建设备上下文与位图,利用设备上下文进行绘图,将绘图数据复制到位图,再从位图中获取想要的窗口图形数据,但是这个接口对部分窗口进行截图时,位图是无法获取图形数据或者获取不到指定窗口的图形数据,出现了黑屏(例如,对calculator计算器进行窗口捕获)或者窗口透明(例如,对谷歌浏览器进行窗口捕获)的问题,导致这个接口无法兼容所有程序,无法达到要求。
    搜索过位图获取不到指定数据的原因,网上表示说是因为windows的窗口中有WS_EX_LAYERED属性导致的,但是验证过,并不成立,但是目前没有找到这个接口出现这个问题的根本原因,希望了解过的大佬可以告知

    DXGI
    DXGI目前只实现了桌面截图,但是并没有深入研究是否支持窗口捕获的
    DXGI是对D3Ddevice进行初始化,然后来获取图形数据,但是并不了解是否可以实现窗口捕获,目前正在查阅资料

    Desktop Window Manager
    DWM虽然可以获取到指定窗口的捕获,但是没法达到窗口录制的需求

    结论:
    目前,没有找到可以满足需求的windows api,因为由于对系统开发编程不够熟悉,遇到了技术上的困境,现在没有想到更好的解决方案(要求:满足能够捕获windows下指定窗口的图形数据,当捕获指定窗口时,获取该窗口的图形数据,并且只有该窗口的图形数据,而不会出现其他窗口)
    曾经想过一个方案,利用windows窗口句柄来获取指定窗口的位置与大小,然后对全屏桌面窗口进行区域截取来录制,但是当多个窗口重叠时,会出现指定窗口被屏蔽的问题,故此该方案放弃
    希望红客的大佬可以给点建议或者方向(可以确定的是该需求已经有公司实现了,但是如何实现,对于小白来说,实在是个问题)
  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 100 天

    [LV.6]常住居民II

    发表于 2020-5-23 19:30:49 | 显示全部楼层
    'PrintWindow这个API是用来复制对象(hdc)的图像
    Option Explicit
    Private Declare Function PrintWindow Lib "user32" (ByVal hwnd As Long, ByVal HDC As Long, ByVal nFlags As Long) As Long
    Dim AppDisk$
    Private Sub Form_Load()
       Picture1.AutoRedraw = True: Picture1.BorderStyle = 0 '图片框自动重画为真并且设成无边框
       AppDisk = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\") '将本地路径赋值给变量AppDisk
       Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 '窗体居中
    End Sub

    Private Sub Form_Click()
       Picture1.Width = Me.Width: Picture1.Height = Me.Height
       PrintWindow Me.hwnd, Picture1.HDC, 0 '调用PrintWindow这个API 复制对象的图像到Picture1图片框
       DoEvents
       SavePicture Picture1.Image, AppDisk & "Test.bmp" '保存图像到本地路径下的Test.bmp 如要保存为jpg或gif得另外使用GDI
       MsgBox "窗体界面保存完成!"
    End Sub
    vb窗体截取实例
    你抓到窗口的句柄就行
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /1 下一条

    红盟社区--中国红客联盟 

    Processed in 0.084225 second(s), 15 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表