创建一个虚拟窗口,仅用于在内存中绘画



我有一个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。这将绘制到您选择的位图中,因此之后您可以使用位图执行所需的操作。

最新更新