winapi - 将窗口大小调整为更大的显示大小,并从中捕获图像
问题描述
有一个程序,显示一些动画。我需要捕捉它,在高分辨率 (2k) 投影仪上显示它。我的显示器具有全高清 (1920x1080) 分辨率,因此从它捕获的视频将被缩放,从而降低 2k 投影仪的质量。
不幸的是,我无法在投影仪上录制它。
我试图通过下一个代码更改显示分辨率:
DEVMODE devmode;
devmode.dmPelsWidth = 2000;
devmode.dmPelsHeight = 900;
devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
devmode.dmSize = sizeof(DEVMODE);
long result = ChangeDisplaySettings(&devmode, 0);
但是如果设置的分辨率高于显示器的分辨率,它会失败。
我还尝试调整程序窗口的大小。我通过 找到它FindWindow
,而不是调整大小。尽管调整了窗口大小,但渲染区域等于显示大小,并且所有超出的内容都没有更新。
我唯一的想法是在虚拟机下以我需要的分辨率运行程序。
也许有办法调整窗口大小,然后像图像一样缩小它?从物理上讲,它会很小,但它本身就具有高分辨率?
如果尝试访问进程内存并尝试查找位图或类似的东西怎么办?
有任何想法吗?
更新
我发现了一个按钮,它可以制作正确的屏幕截图,即使窗口的一部分位于不可见区域。单击后,它会打开默认的 Windows 另存为对话框。显然,我可以制作一个程序,点击按钮,设置文件名递增1,然后点击保存按钮,但我会丢失很多帧。
打赌,要保存的位图是在显示对话框之前创建的。也许我能以某种方式抓住它。我在按下屏幕截图按钮之前和之后检查了 GDI 对象计数,不幸的是,差异大约是 20 个元素,可能是因为保存对话框窗口对象也在计数。
解决方案
AMD 显卡具有称为虚拟超分辨率的功能,它允许您将显示升级到虚拟 2k,甚至 4k。您捕获的将是 2k,并在 1080p 面板上缩小。我想NVIDIA也有这个功能,虽然我不知道这个叫什么。
推荐阅读
- jmockit - Jmockit - 如何调试
- c++ - 在下面给出的示例中,我如何在向量的向量中 push_back?
- python - 大型 NumPy 数组的成对距离(分块?)
- r - 通过 read.csv 在 r 的列中读取“NA”值
- emacs - 无法在现有 leiningen 项目中添加依赖项或库
- mysql - 如何在 MySQL 中使用数组
- google-maps - 在运行地图时遇到问题,无一例外 googleMaps&Flutter
- javafx - 在窗格上测试 setOnKeyPressed 时,TestFX 不起作用
- reactjs - 反应 onClick 事件不起作用
- java - java中的RestAPI返回Json和CSR文件