GDIまたはDirectXのいずれかの方法を使用して、Windowsでスクリーンキャプチャを行うための多数の投稿があることは知っています。しかし、キャプチャした画像をビットマップに保存していたのに対し、代わりにバッファに保存したいと思っていました。ここに私のコードは、GDIの方法で行うことです。Windowsで4K画面をキャプチャしてバッファに直接保存する
HWND hwind = GetDesktopWindow();
HDC hdc = GetDC(hwind);
uint32_t resx = GetSystemMetrics(SM_CXSCREEN);
uint32_t resy = GetSystemMetrics(SM_CYSCREEN);
uint32_t BitsPerPixel = GetDeviceCaps(hdc, BITSPIXEL);
HDC hdc2 = CreateCompatibleDC(hdc);
BITMAPINFO info;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = resx;
info.bmiHeader.biHeight = resy;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = BitsPerPixel;
info.bmiHeader.biCompression = BI_RGB;
void *data;
static HBITMAP hbitmap = CreateDIBSection(hdc2, &info, DIB_RGB_COLORS,
(void**)&data, 0, 0);
SelectObject(hdc2, hbitmap);
BitBlt(hdc2, 0, 0, resx, resy, hdc, 0, 0, SRCCOPY);
uint8_t *ptr = new uint8_t[4 * resx * resy];
uint32_t lineSizeSrc = 4 * resx; // not always correct
uint32_t linesizeDst = 4 * resx;
for (uint32_t y = 0; y < resy; y++)
memcpy(ptr + y * lineSizeDst,
(uint8_t*) data + y * lineSizeSrc,
lineSizeDst);
DeleteObject(hbitmap);
ReleaseDC(hwind, hdc);
if (hdc2) {
DeleteDC(hdc2);
}
まず、私の知る限りでは、このコードでlineSizeSrc
の値は、画面の解像度に依存するので、いくつかのゼロが追加されて常に正確ではありません各行はdata
です。ゼロが追加されたときに、lineSizeSrc
の正しい値を取得する方法を教えてください。
第2に、グラフィックカードを4K解像度で出力するなど、モニタの解像度に関係なく、4K解像度でキャプチャされた画像を取得できますか?