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