让我先说明我的开发要领。我正在写一个Windows DLL。我关注的编程语言是C / C ++。当我的任务需要时,Asm块也是可能的。也许甚至是司机,但我根本没有任何经验。 DLL被注入主机进程。这一直是Directx环境。 Dx9,Dx10或Dx11可以在全屏或窗口模式下运行。 该方法应支持windows xp到Windows 7,并且仅在x86中编译。
目标是提供一个功能,获取给定流程窗口的屏幕截图。屏幕截图永远不会从主机进程本身获取。它总是另一个过程!该窗口可能包含directx或gdi32内容。也许其他内容是可能的,我现在没想到(窗体形式出现在我的脑海里。我不确定它是如何在内部呈现的)。窗户可以最小化。
根据我正在使用的Directx环境,该屏幕截图需要可访问/转换为directx纹理,例如Texture2D。将屏幕截图保存为png / bmp就足够了,因为我知道如何创建这样的记忆中的纹理。
我已经尝试过旧式的BitBlt方式,这种方式对最小化的应用程序没有用。当我将WM_PAINT消息发送到目标窗口时,正在绘制最小化的应用程序。这对我来说是一个解决方案,因为我还需要跟上对此类消息没有反应的directx应用程序。
也许我需要挂钩每个DirectX窗口以完成我的任务,直接访问后台缓冲区,我希望无论如何都希望有更好的方法。
由于我确实从多个窗口中截取了大量屏幕截图,我想实现一个快速方法,这不是一个cpu假。在满足此类性能需求时,从VideoRAM复制可能是一种不好的方法。
我希望有一些想法,也许是代码样本,因为我不熟悉我可以采用的所有可能性。我看过一些windows缩略图api,但是我不能从我能阅读的内容中支持xp。
提前致谢, 弗兰克