我有一个win32屏幕保护程序应用程序,该应用程序从传递到ScreenSaverProc
的HWND获取其设备上下文,例如使用BeginPaint
。
现在我想使用相同的代码来创建屏幕保护程序的视频(使用ffmpeg
,但这无关紧要)。我想做的是在调用ScreenSaverProc
的代码周围放一个包装器(而不是让libscrsave
这样做),并传入某种虚拟窗口,以便它可以像往常一样获取设备上下文并在其上绘制,但是在包装器代码中,我可以获取设备上下文的位图并将其复制到视频的帧中。
有没有办法创建这样的虚拟窗口?只创建一个常规窗口并将其隐藏会起作用吗?
我会将屏幕保护程序构造成一个精简包装函数,该函数仅获取设备上下文,然后调用另一个函数以绘制到 DC 中:
void On_WmPaint() {
HDC dc = BeginPaint();
// ...
do_draw(dc);
EndPaint();
}
void do_draw(HDC dc) {
// ...
}
然后,当您想为视频创建帧时,您可以使用 创建兼容DC(一种可能性)来创建与您的屏幕兼容的 DC。然后使用 CreateCompatibleBitmap 创建位图(也与屏幕兼容)。将该位图选择到 DC 中,然后调用 do_draw
,将其传递给该 DC。这将绘制到您选择的位图中,因此之后您可以使用位图执行所需的操作。