2

「Windowsハンドル」を使用してスクリーンショットを作成するリモートアプリケーションがあります。(つまりHDC、、HBITMAP....)。

コードは次のようになります。

int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
HDC hDesktopDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);

HBITMAP hCaptureBitmap =CreateCompatibleBitmap(
    hDesktopDC, 
    nScreenWidth,
    nScreenHeight);

SelectObject(hCaptureDC,hCaptureBitmap); 

BitBlt(
    hCaptureDC,
    0,0,
    nScreenWidth,nScreenHeight,
    hDesktopDC,
    0,0,
    SRCCOPY); 

BITMAPINFOHEADER   info;

info.biSize = sizeof(BITMAPINFOHEADER);
info.biWidth = nScreenWidth;   
info.biHeight = nScreenHeight; 
info.biPlanes = 1; 
info.biBitCount = 32;
info.biCompression = BI_RGB;    
info.biSizeImage = 0;
info.biXPelsPerMeter = 0;
info.biYPelsPerMeter = 0;
info.biClrUsed = 0;
info.biClrImportant = 0;

//reteive the image data 
byte *bits= (byte*)malloc(nScreenWidth*nScreenHeight*4);
GetDIBits(hDesktopDC,   // handle to DC
    hCaptureBitmap,     // handle to bitmap
    0,                  // first scan line to set
    nScreenHeight,      // number of scan lines to copy
    bits,               // array for bitmap bits
    (BITMAPINFO*)&info, // bitmap data buffer
    DIB_RGB_COLORS      // RGB 
    );

DeleteDC(hDesktopDC);
DeleteDC(hCaptureDC);
DeleteObject(hCaptureBitmap);

多くのループ(約2000)の後、CreateDC()関数は return NULL. そして、DC を古いものにすると (一度初期化してから、アプリケーションの終了時に破棄することを意味します)、アプリケーション ウィンドウがフリック (またはその一部) するか、完全に見えなくなることさえあります。

したがって、この問題を解決する方法を知るか、画面イメージ (ビット/RGB データ) を取得するための他のより良い方法を知る必要があります。

4

0 に答える 0