要把屏幕录制下来,最好用什么?
如果是要抓取录制远程的屏幕又应该用什么?

解决方案 »

  1.   

    是想问问有没有现成的SDK啊什么之类的东东。
      

  2.   

    ultravnc 有源码
    ultravnc.sourceforge.net
      

  3.   

    嗯,needways(needways)给的东西不错,不过图像变化快的时候有时候会花屏。
    还有录制呢,感觉用编码器录制800*600的分辨率,CPU根本转不过来啊。
      

  4.   

    你看看冰河的文章,真的,我记得我以前看过类似的问题,在远程好像不是通过截屏的方式,而是直接从一个与显卡有关的东东上直接获得(具体是什么,忘了),它这样做的接过是当屏目有变化时截获,而不是采用定时截获的方式,而且因为不是截屏,传输速率也很高现成的SDK肯定是没有的,呵呵,自己钻研嘛,别什么都找源代码。
      

  5.   

    给你一段截屏并保存成BMP的原码
    HANDLE DDBToDIB(CBitmap &bitmap, DWORD dwCompression, CPalette *pPal)
    {
    BITMAP bm;
    BITMAPINFOHEADER bi;
    LPBITMAPINFOHEADER lpbi;
    DWORD dwLen;
    HANDLE hDIB;
    HANDLE handle;
    HDC hDC;
    HPALETTE hPal;
    ASSERT(bitmap.GetSafeHandle());
    if(dwCompression==BI_BITFIELDS)
    return NULL;
    hPal=(HPALETTE)pPal->GetSafeHandle();
    if(hPal==NULL)
    {
    hPal=(HPALETTE)GetStockObject(DEFAULT_PALETTE);
    }
    bitmap.GetObject(sizeof(bm),(LPSTR)&bm); bi.biSize=sizeof(BITMAPINFOHEADER);
    bi.biWidth=bm.bmWidth;
    bi.biHeight=bm.bmHeight;
    bi.biPlanes=1;
    bi.biBitCount=bm.bmPlanes*bm.bmBitsPixel;
    bi.biCompression=dwCompression;
    bi.biSizeImage=0;
    bi.biXPelsPerMeter=0;
    bi.biYPelsPerMeter=0;
    bi.biClrUsed=0;
    bi.biClrImportant=0; int nColors=(1<<bi.biBitCount);
    // if(nColors>256)
    // nColors=0;
    dwLen=bi.biSize+nColors*sizeof(RGBQUAD);

    hDC=GetDC(NULL);
    hPal=SelectPalette(hDC,hPal,FALSE);
    RealizePalette(hDC); hDIB=GlobalAlloc(GMEM_FIXED,dwLen);
    if(!hDIB)
    {
    SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return NULL;
    } lpbi=(LPBITMAPINFOHEADER)hDIB;
    *lpbi=bi; GetDIBits(hDC,(HBITMAP)bitmap.GetSafeHandle(),0L,(DWORD)bi.biHeight,
    (LPBYTE)NULL,(LPBITMAPINFO)lpbi,(DWORD)DIB_RGB_COLORS);
    bi=*lpbi;
    if(bi.biSizeImage==0)
    {
    bi.biSizeImage=(((bi.biWidth*bi.biBitCount)+31)&~31)/8*bi.biHeight;
    if(dwCompression!=BI_RGB)
    {
    bi.biSizeImage=(bi.biSizeImage*3)/2;
    }
    } dwLen+=bi.biSizeImage;
    if(handle=GlobalReAlloc(hDIB,dwLen,GMEM_MOVEABLE))
    {
    hDIB=handle;
    }
    else
    {
    GlobalFree(hDIB);
    SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return NULL;
    } lpbi=(LPBITMAPINFOHEADER)hDIB; BOOL bGotBits=GetDIBits(hDC,(HBITMAP)bitmap.GetSafeHandle(),0L,
    (DWORD)bi.biHeight,
    (LPBYTE)lpbi+(bi.biSize+nColors*sizeof(RGBQUAD)),
    (LPBITMAPINFO)lpbi,
    (DWORD)DIB_RGB_COLORS); if(!bGotBits)
    {
    GlobalFree(hDIB);
    SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return NULL;
    } SelectPalette(hDC,hPal,FALSE);
    ReleaseDC(NULL,hDC);
    return hDIB;
    }BOOL WriteDIB(LPTSTR szFile, HANDLE hDIB)
    {
    BITMAPFILEHEADER hdr;
    LPBITMAPINFOHEADER lpbi;
    if(!hDIB)
    {
    return FALSE;
    }
    CFile file;
    if(!file.Open(szFile,CFile::modeWrite|CFile::modeCreate,NULL))
    {
    return FALSE;
    } lpbi=(LPBITMAPINFOHEADER)hDIB;
    int nColors=1<<lpbi->biBitCount; hdr.bfType=((WORD)('M'<<8)|'B');
    hdr.bfSize=GlobalSize(hDIB)+sizeof(hdr);
    hdr.bfReserved1=0;
    hdr.bfReserved2=0;
    hdr.bfOffBits=(DWORD)(sizeof(hdr)+lpbi->biSize+nColors*sizeof(RGBQUAD)); file.Write(&hdr,sizeof(hdr));
    file.Write(lpbi,GlobalSize(hDIB));
    file.Close();
    return TRUE;
    }
      

  6.   

    void SaveRectToBmp(CRect rect)
    {
    CDC dc;
    dc.Attach(::GetDC(NULL)); CDC m_dcBKMem;
    CBitmap m_bmpBKMem,*m_pOldBKBmp;
    m_dcBKMem.CreateCompatibleDC(&dc);
    m_bmpBKMem.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); m_pOldBKBmp = m_dcBKMem.SelectObject(&m_bmpBKMem);
    m_dcBKMem.BitBlt(0, 0, rect.Width(), rect.Height(), &dc, rect.left, rect.top, SRCCOPY); HANDLE hDib;
    CPalette Pal;
    hDib=DDBToDIB(m_bmpBKMem,BI_RGB,&Pal);
    WriteDIB("text.bmp",hDib);
    //  DeleteDC(dc.GetSafeHdc());           
    }void OnTest() 
    {
    int cx = GetSystemMetrics(SM_CXFULLSCREEN);
    int cy = GetSystemMetrics(SM_CYFULLSCREEN);
    CRect rect(0,0,cx,cy);
    // ScreenToClient(&rect);
    SaveRectToBmp(rect);
    }