title: retrieve window screenshot / capture
body: <p>I have a remote application that the a screenshot using "windows handle". ( I mean <code>HDC</code>, <code>HBITMAP</code>, ....).</p>
  
  <p>The code look like this :</p>
  
  <pre><code>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*)&amp;info, // bitmap data buffer
      DIB_RGB_COLORS      // RGB 
      );
  
  DeleteDC(hDesktopDC);
  DeleteDC(hCaptureDC);
  DeleteObject(hCaptureBitmap);
  </code></pre>
  
  <p>After many loop the (about 2000) the <code>CreateDC()</code> function return <code>NULL</code>. And, if I old the DC (mean intialize it once, then destroyed on application exit) my application window flick (or part of it) or even get entirely invisible.</p>
  
  <p>Thus, I'll need to know how to figure this issue out or know any other better way to get the screen image (bits/RGB data).</p>