解决一个所谓的开源精粹 使用Windows.Graphics.Capture WGC对后台窗口句柄截图

解决一个所谓的开源精粹 使用Windows.Graphics.Capture WGC对后台窗口句柄截图

起因

起因是想对窗口句柄(游戏窗体)进行区域截图,回调原始每个点的RGB数据,用于分析,要求是窗口不在前台被其他窗口覆盖也能正常截图,技术门槛不能太高(本人善用C#,不擅长C++),搜索一圈下来发现目前使用WGC(Windows.Graphics.Capture)微软官方API比较适合我的应用,对于环境的要求是必须WIN10 1903(18362)版本之后(其实就是2019年后的WIN10),这个问题不是太大,相信目前已经没有多少WIN7的存在了。于是搜索一下现有的库(能用轮子自然不必要自己造),翻到一些微软自带的例程和说明

微软BLOG New Ways to do Screen Capture
https://blogs.windows.com/windowsdeveloper/2019/09/16/new-ways-to-do-screen-capture/

下载了例程,编译了试一下,效果不错,醒目的是截图的窗体显外示一个黄色框,相当于提醒用户该窗体正在被记录。

开源在GITHUB上
https://github.com/Microsoft/Windows.UI.Composition-Win32-Samples/tree/master/dotnet/WPF/ScreenCapture

使用C++ WIN SDK的微软例程
https://github.com/microsoft/Windows.UI.Composition-Win32-Samples/tree/master/cpp/ScreenCaptureforHWND

由于使用的是WPF窗体,对于已经习惯了DotNetFramework窗体的我想改造一下,在Nuget上搜索了几个库,发现都是都全屏录屏编码MP4,我的需求是直接给定一个窗体句柄,然后根据我需要的区域设置返回实时的画面点r RGB数据。于是继续搜索,在csdn.net上找到了下面这篇东西。

开源精粹:Windows Graphics Capture (WGC) —— 高效桌面窗口采集新选择
https://blog.csdn.net/gitblog_09807/article/details/143408928

项目位置
https://gitcode.com/open-source-toolkit/77270/

看着描述,完全符合我的需求,激动我心,还开源,太赞,反转在下面。

看看现在的CSDN都是个什么鬼
在这里插入图片描述

反转

点开项目一看,就提交了一个wgclib.zip 文件包,下载解开包一看
一个wgclib_x64.dll 动态链接库
一个wgclib.h头文件
一个示例python(这也叫开源?开源了示例python开源叫开源?)
想着也罢,如果DLL库能用,直接引用过来使用其中的函数也行吧,结果现实总能再给你一巴掌,没有甜枣的那种

再转

先试运行一下python示例,看看是不是真实有效,还不错,可以运行,剖析代码几个关键函数的引用定义如下 ,调用时输入的pUser=100是userid
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
基本思路简单,注册一个回调函数,一个dll函数执行,直接回调截取的数据
在这里插入图片描述
在这里插入图片描述
可是硬件信息,过期时间是个什么鬼
打开loadwgc.py和.h头文件看一眼
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
花头不多,很明确,授权码-硬件信息-过期时间 联系人 三板斧老套路要钱

使用python试用后,发现真正的限制只有60s的试用限制,其他按python里的填auth进行初始化后,填窗口句柄,帧率都是正常,但在60s后会停止输出信息

干它

这怎么能忍,写了开源了,开的是python示例,结果还有限制不能完全正常使用,还要机器码,README里半句不提有限制的事。

上手cutter工具,deepseek推荐的目前比较好用的C++反编译工具
绿色软件,直接运行在这里插入图片描述
写入模式加载DLL库文件

左侧拉到最下方找到 init函数
在这里插入图片描述

反编译器里看一眼这个init干了什么,按定义注册码在这里输入
在这里插入图片描述
简单粗暴,懒得自己看,直接把代码丢给claudi.ai分析
在这里插入图片描述
点开其中的95e0和eae0两个函数继续给AI分析
在这里插入图片描述
现在可以确定eae0为验证返回结果 95e0为字符串处理

在这里插入图片描述
起始根据claudi的提示想改如下位置
在这里插入图片描述
可惜空间不够
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最终按claudi的方案4搞定
在这里插入图片描述
直接修改这个函数的开始位置 让函数直接返回eax=1,不够的用nop空指令填充

在这里插入图片描述
两边比较,左侧为修改后,右侧为原来的,经测试,修改后60s的限制没有了,别的暗桩也没有工夫再去细察了
在这里插入图片描述

后记

修改后的DLL在我的DOTNET中怎么引用也遇到了一些小坑,
最初想用传统DllImport的方式引用DLL中的函数,直接对函数作C#申明类似下面
在这里插入图片描述

结果在执行init的时候提示

不要尝试在 DllMain 或映像初始化函数内运行托管代码

原因在dll库里还引用了托管代码,这个win_hwnd是用来显示截图内容的句柄,可以是一个panel的句柄,则把截图的内容显示的panel上,如果不填,则会生成一个窗口
在这里插入图片描述
因此只能使用.NET 5.0+,不能使用DOTNETFRAMEWORK,使用NativeLibrary的方式加载dll
定义函数
在这里插入图片描述
定义类型
在这里插入图片描述
加载DLL函数为委托
在这里插入图片描述
调用注册函数
在这里插入图片描述

回调函数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值