2010-04-16 5 views
1

J'ai capturé le bureau total en utilisant CPP, COM et DirectShow. Mais comment puis-je capturer une fenêtre particulière seulement?Comment capturer une fenêtre particulière au lieu du bureau total?

+0

Voulez-vous dire la capture comme dans la capture d'écran? –

+0

Pas une capture d'écran, mais je dois capturer une fenêtre particulière qui peut être redimensionner, minimiser et publier sur l'extrémité distante. Aussi ce qui devrait être mis à l'extrémité distante lorsque cette fenêtre est minimisée? – Rupali

Répondre

0

-je utiliser quelques aides - mais ceux-ci devraient être faciles à traduire dans ce que vous avez besoin:

// Copy the contents of the client area or the window into an HBITMAP 
HBITMAP CaptureWindow(HWND hwnd, bool bIncludeFrame, const RECT * pClip) 
{ 
    // get the DC of the source 
    HDC hdcSource = bIncludeFrame ? ::GetWindowDC(hwnd) : ::GetDC(hwnd); 

    // get a memory DC 
    HDC hdcMemory = ::CreateCompatibleDC(hdcSource); 

    // get the clipping rect 
    RECT rcClip; 
    if (pClip) 
     rcClip = *pClip; 
    else if (bIncludeFrame) 
     ::GetWindowRect(hwnd, &rcClip); 
    else 
     ::GetClientRect(hwnd, &rcClip); 

    // determine the size of bitmap we're going to be making 
    SIZE sz = { rcClip.right - rcClip.left, rcClip.bottom - rcClip.top }; 

    // create a bitmap on which to copy the image 
    HBITMAP hbmCapture = ::CreateCompatibleBitmap(hdcSource, sz.cx, sz.cy); 

    // temporarily select our bitmap into the memory DC, grab the image, then deselect it again 
    if (AutoSelectGDIObject & select_capture = AutoSelectGDIObject(hdcMemory, hbmCapture)) 
     ::BitBlt(hdcMemory, 0, 0, sz.cx, sz.cy, hdcSource, rcClip.left, rcClip.top, SRCCOPY); 

    // release our resources 
    ::DeleteDC(hdcMemory); 
    ::ReleaseDC(hwnd, hdcSource); 

    // return the captured bitmap 
    return hbmCapture; 
} 
0
  1. La façon dont vous capturer bureau, BitBlt seule la région de la fenêtre d'intérêt dans votre offscreen bitmap (pensez à capture d'image bureau complet et le recadrage à la position de la fenêtre)
  2. Ou, utilisez WM_PAINT, WM_PRINTCLIENT messages pour demander la fenêtre pour se peindre dans votre DC
Questions connexes