gpt4 book ai didi

windows - 如何将 Direct3D/WPF/DWM 窗口捕获到位图中?

转载 作者:可可西里 更新时间:2023-11-01 09:35:20 26 4
gpt4 key购买 nike

捕获窗口图像的正常方法是调用:

HDC SharedWndDC = GetWindowDC(SharedWnd);
BitBlt(BitmapDC, 0, 0, width, height, SharedWndDC, 0, 0, SRCCOPY /* |CAPTUREBLT */);
ReleaseDC(SharedWnd, SharedWndDC);

在运行 DWM 的系统上,它可以很好地捕获有问题的窗口,即使它被其他窗口重叠或部分离开屏幕,等等。

但是,它在某些窗口(可能是那些使用 WPF 的窗口)上无法正常工作,并且会对玻璃区域产生一些有趣的影响。基本上,GDI 捕获不适用于非 GDI 事物。

我知道我真正想要的是获取 Direct3D“后台缓冲区”或“前台缓冲区”,但我看到的大量示例都是为了获取整个屏幕或桌面。由于不了解 Direct3D,我无法找到示例或简单说明如何为现有窗口 获取合适的对象,然后我可以从中获取缓冲区。

至少有好心人可以显示缺失的部分吗?

—约翰

最佳答案

我不相信有一种方法可以在不捕获整个屏幕的情况下捕获前台缓冲区的内容,并且后台缓冲区对于运行 Direct3D 的应用程序是私有(private)的。前缓冲区的内容只有在显卡实际将数据呈现给显示器时才能看到。使用 GDI,Windows 可以访问前台和后台缓冲区,因为它自己管理它们。但是对于 Direct3D(我假设是 WPF),情况就不同了。 Windows 无权访问缓冲区,因此,除非应用程序将数据提供给 Windows,否则无法获取数据,这是不可能的(没有消息定义这样做)。

编辑:

这看起来像是一个死问题,但无论如何我都会添加它以防其他人来寻找答案。上述问题仍然适用于以编程方式获取窗口内容。但是,在 Windows 中,当您要捕获的窗口具有键盘焦点(也就是它是事件窗口)时,可以通过使用快捷键 ALT+Print Screen 来获取单个窗口的内容。这可能对您有帮助,也可能没有帮助,但它确实只捕获有问题的窗口的内容,即使使用 DirectX 内容也是如此。

关于windows - 如何将 Direct3D/WPF/DWM 窗口捕获到位图中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8784270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com