このコードを使用してデスクトップをキャプチャします。
Frame::Frame()
{
source_win=GetDesktopWindow();
RECT r;
GetWindowRect(source_win,&r);
width=r.right;
height=r.bottom;
source_context=GetDC(source_win);
sink_context=CreateCompatibleDC(source_context);
sink_bitmap=CreateCompatibleBitmap(source_context,width,height);
old_obj=SelectObject(sink_context,sink_bitmap);
memset(&info_out,0,sizeof(info_out));
info_out.bmiHeader.biSize=sizeof(info_out.bmiHeader);
GetDIBits(source_context,sink_bitmap,0,0,NULL,&info_out,DIB_RGB_COLORS);
info_out.bmiHeader.biBitCount=24;
info_out.bmiHeader.biCompression=BI_RGB;
bitmapdata=malloc(getScanlineSize(info_out.bmiHeader.biWidth
,info_out.bmiHeader.biBitCount)
*info_out.bmiHeader.biHeight);
p_rows=(void**)malloc(sizeof(void*)*info_out.bmiHeader.biHeight);
for(int k=0;k<info_out.bmiHeader.biHeight;k++)
{
p_rows[info_out.bmiHeader.biHeight-k-1]=(char*)bitmapdata + k*getScanlineSize(info_out.bmiHeader.biWidth,info_out.bmiHeader.biBitCount);
}
}
void Frame::capture()
{
BitBlt(sink_context,0,0,width,height,source_context,0,0,SRCCOPY|CAPTUREBLT);
GetDIBits(sink_context,sink_bitmap,0,info_out.bmiHeader.biHeight
,bitmapdata,&info_out,DIB_RGB_COLORS);
}
Frame::~Frame()
{
free(p_rows);
free(bitmapdata);
SelectObject(sink_context,old_obj);
DeleteObject(sink_bitmap);
DeleteDC(sink_context);
ReleaseDC(source_win,source_context);
}
ダブル バッファリングされたアプリケーションが少なくとも 1 つ実行されている場合、これは Windows XP でフルスクリーンの OpenGL アプリをキャプチャする場合にうまく機能します。ただし、Windows 7 では、黒いフレームしか生成されません。コードを修正して再び機能させるにはどうすればよいですか?
問題があれば、私は 64 ビット版を実行しています。ライセンスに互換性がないため、迂回はオプションではありません。
編集: コードは、非フルスクリーン アプリケーションで完全に機能します。問題は、フルスクリーン アプリケーションの実行時に DesktopWindow が黒くなることです。