0

我有一个 win32 屏幕保护程序应用程序,它从传入的 HWND 获取其设备上下文ScreenSaverProc,例如使用BeginPaint.

现在我想使用相同的代码来创建屏幕保护程序的视频(使用ffmpeg,但这不相关)。我想做的是在调用的代码周围放置一个包装器ScreenSaverProc(而不是libscrsave这样做),并传入某种虚拟窗口,以便它可以像往常一样获取设备上下文并在其上绘制,但随后在包装代码中,我可以获取设备上下文的位图并将其复制到视频帧中。

有没有办法创建这样一个虚拟窗口?只创建一个常规窗口并将其隐藏是否有效?

4

1 回答 1

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 中选择的位图中,因此之后您可以使用位图做您想做的事情。

于 2013-10-19T07:47:19.737 回答