我怎么才能把屏幕上的某一块动态地抓取下来存成文件,
比如正在操作的动作或播放的视频,
以后再进行播放录像呢?

解决方案 »

  1.   

    我用过snagit,非常好用,随便找桌面一块窗口就开始进行录像.
    但我不知道怎么做的,有没有高手懂呢
      

  2.   

    是不是等到程序的cdc 在一定时间内,copy 存起来...
    一秒存多少个是不是就行了...
      

  3.   

    这样吧
    GetScreenBmp可以得到当前屏幕的图象并保存成HBITMAP
    然后用下面的WriteBmp将它在磁盘上.
    你不妨用SetTimer设置个定时器,没秒钟存一张,合起来不就是动画片了吗?
    HBITMAP GetScreenBmp()
    {
       HWND hwnd = ::GetDesktopWindow();
       HDC hsrc = ::GetDC(hwnd);
       HDC hmemdc = ::CreateCompatibleDC(hsrc);
       RECT rc; ::GetWindowRect(hwnd,&rc);
       SIZE sz;sz.cx=rc.right-rc.left;sz.cy=rc.bottom-rc.top;
       HBITMAP hbmp = ::CreateCompatibleBitmap(hsrc,sz.cx,sz.cy);
       HGDIOBJ holdbmp = ::SelectObject(hmemdc,hbmp);
       ::BitBlt(hmemdc,0,0,sz.cx,sz.cy,hsrc,rc.left,rc.top,SRCCOPY);
       ::SelectObject(hmemdc,holdbmp);
       ::DeleteObject(hmemdc);
       ::ReleaseDC(hwnd,hsrc);
       return hbmp;
    }BOOL WriteBmp(HBITMAP hBitmap)
    {
    BITMAPINFO *m_pBMI;
    BYTE *m_pDIBData;
    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bi;
    BITMAP BM;
    GetObject(hBitmap,sizeof(BM),&BM);
    HDC hdc=GetDC(NULL);
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = BM.bmWidth;
    bi.biHeight  = BM.bmHeight;
    bi.biPlanes  = 1;
    bi.biBitCount = 24;
    bi.biCompression = 0;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;
        
    bfh.bfType=0x4d42;
    bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER);
    bfh.bfSize=bfh.bfOffBits+BM.bmWidth*BM.bmHeight*3;
    bfh.bfReserved1=0;
    bfh.bfReserved2=0;

    m_pBMI=(BITMAPINFO*)new char[sizeof(BITMAPINFO)];
        m_pDIBData=(BYTE*)new char[bfh.bfSize-bfh.bfOffBits];

    memcpy(m_pBMI,&bi,sizeof(BITMAPINFOHEADER));
    GetDIBits(hdc,hBitmap, 0l, (DWORD)bi.biHeight,
    (LPVOID)m_pDIBData,(LPBITMAPINFO)m_pBMI, (DWORD)DIB_RGB_COLORS);
    //StretchDIBits(dc.GetSafeHdc(),0,0,800,600,0,0,800,600,m_pDIBData,m_pBMI,DIB_RGB_COLORS,SRCCOPY);
    HANDLE hFile;
    DWORD dw;
    hFile=CreateFile("Screen.bmp",
    GENERIC_READ|GENERIC_WRITE,
    0,NULL,CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
    if(hFile!=INVALID_HANDLE_VALUE)
    {
    WriteFile(hFile,(LPVOID)&bfh,sizeof(bfh),&dw,NULL);
    WriteFile(hFile,(LPVOID)m_pBMI,sizeof(BITMAPINFOHEADER),&dw,NULL);
    WriteFile(hFile,(LPVOID)m_pDIBData,BM.bmWidth*BM.bmHeight*3,&dw,NULL);
    CloseHandle(hFile);
    return TRUE;
    }
    return FALSE;}
      

  4.   

    还有,注意上面
    hFile=CreateFile("Screen.bmp",
    GENERIC_READ|GENERIC_WRITE,
    0,NULL,CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
    中的保存的文件名"Screen.bmp"自己要改哦.
    还有,如果一秒钟存一张,你的硬盘会很快挤满
      

  5.   

    你可以自己再编个播放软件,将一系列bmp文件连续播放出来成动画.
      

  6.   

    我用snagit怎么就抓不找动画呢,抓下来一播放,全是黑屏,什么都没有?
      

  7.   

    hFile=CreateFile("Screen.bmp",
    GENERIC_READ|GENERIC_WRITE,
    0,NULL,CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
    中的保存的文件名"Screen.bmp"自己要改哦.
      

  8.   

    您可以将一系列的图片连成AVI,MSDN里有这方面的例程的.但不知如何边成GIF或MPEG,请高手指教!
      

  9.   

    在 http://www.atomixbuttons.com/vsc/中有你所需要的东西,并且有VC源代码,下载完后别忘了给分。
      

  10.   

    用directshow把,可以视频捕捉,还可以编辑
      

  11.   

    如果像上面说的这样,拿现在就是要把图片连成动画了,对吧?你可以用flash,将图片到如今去,保存成gif格式,就成了动画了。
      

  12.   

    使用WM encoder SDK,对截取屏幕很容易,而且可以压缩成一个WM格式的文件。
      

  13.   

    你先要了解一下avi ,bmp等文件格式,及directshow的基本操作,还要有directX的SDK,呵呵,好烦视频:你的视频不是天上掉下来的把,总有一个源,比如说avi文件,摄像头,或者一个网上的视频流,可以用directshow 把一些filter连接起来,比如用摄像头拍到的视频流做源filter,中间加什么转化mpeg,之类的filter,再写到avi中去屏幕操作:1记录开始抓取时间,有一个sdk函数
             2可以先抓图成bmp
             3建立一个avi文件,记住要自己定义avi文件的header,比如文件格式
    长短,帧格式,播放速度之类
             4把每个bmp作为一帧加入avi中
             5记录结束时间,就可以算出想要每秒几帧
             6再重建一个avi文件,根据需要重写头,可以改变播放速度
             7如果想要转成mpeg之类的就用上边视频的方法转把
      

  14.   

    关注中。
    我要一份原码
    [email protected]
      

  15.   

    WM encoder SDK其中有关于屏幕拷贝成视频的部分,而开发snagit的公司还有一个产品是专门抓屏幕成视频的工具,号称取下来的视频数据效果最好,还可以向其它格式转换,叫com...(我记不住了),你到该公司的网上去看看,此外这个公司还提供相应的sdk,免费版的有标记,而正式版的又太贵了要美元上仟。