最好有代码实现,分不会少。多谢大家。

解决方案 »

  1.   

    it is not very difficult to do,
    start up DirectDraw
    set exclusive mode
    create a Primary Surface and lock it
    read the surface with the the pointer you get backif you want source code, see an example here, :-)
    http://www.xmission.com/~pdalton/projects.htmlThe Main Library
    ---Screen capture functionality, both full screen and window modes. 
      

  2.   

    是要用DirectX截屏,还是截另一个用DirectX的程序的屏?
    要是后一种的话,看来只有挂接DirectX 的Lock()函数了。
      

  3.   

    转载一篇
    如何实现游戏截屏功能  现在很多游戏都提供一种截屏的功能,用来截取游戏中的画面,那么这是如何实现的呢?其实就是把游戏当前屏幕的数据存成一个图片文件;在这里我给出一段源程序,它实现了DirectDraw(16位模式)下的的游戏截屏。生成的文件格式为BMP,程序有比较详细的注释,请各位自己看吧。
    bool Is555; // 是否是565模式,这个变量需要用者填写// 功能:将一个16位的DirectDraw表面,存为一张24位BMP位图 (传入主表面即截屏)
    // 输入:表面指针,输出的文件名
    // 输出:是否成功
    bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
    {
    WORD* lpBuffer; // 表面指针
    int nPitch;  // 表面跨距
    int nWidth, nHeight; // 表面宽高

    // 打开文件s
    FILE* fp;
    if( (fp=fopen(filename, "wb")) != NULL )
    {
    // 锁定表面
    DDSURFACEDESC ddsd;
    ddsd.dwSize = sizeof(ddsd);
    HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
    if( ddrval == DD_OK )
    {
       lpBuffer = (WORD *)ddsd.lpSurface;
    nWidth = ddsd.dwWidth;
    nHeight = ddsd.dwHeight;
    nPitch  = ddsd.lPitch >> 1; //lPitch以Byte为单位,GraphPitch以WORD为单位。所以GraphPitch = lPitch / 2;
    } // 保存文件头
    BITMAPFILEHEADER FileHeader;
    FileHeader.bfType = 'BM';
    FileHeader.bfSize = nWidth * nHeight * 3 + 0x36;
    FileHeader.bfReserved1 = 0;
    FileHeader.bfReserved2 = 0;
    FileHeader.bfOffBits = 0x36;
    fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

    // 保存文件信息
    BITMAPINFOHEADER Header;
    Header.biSize = sizeof(BITMAPINFOHEADER); // 结构的大小
    Header.biWidth = nWidth; // 宽
    Header.biHeight = nHeight; // 高
    Header.biPlanes = 1; // 固定
    Header.biBitCount = 24; // 颜色数
    Header.biCompression = BI_RGB; // 是否压缩
    Header.biSizeImage = nWidth * nHeight * 3; // 图片的大小
    Header.biXPelsPerMeter = 0;
    Header.biYPelsPerMeter = 0;
    Header.biClrUsed = 0;
    Header.biClrImportant = 0;
    fwrite(&Header, Header.biSize, 1, fp); // 写入具体内容(从下向上存放)
    fseek(fp, 0x36, SEEK_SET);
    WORD word;
    lpBuffer += nWidth * (nHeight - 1);
    for(int i=0; i<nHeight; i++)
    {
    for(int j=0; j<nWidth; j++)
    {
    word = *lpBuffer;
    fputc( GetBlue( word ), fp); // 蓝
    fputc( GetGreen( word ), fp); // 绿
    fputc( GetRed( word ), fp); // 红
    lpBuffer++;
    }
    lpBuffer -= nPitch*2; // 指针转到上一行的开始
    } fclose(fp); // 解锁表面
    ddrval = lpSurface->Unlock( NULL );
    return true;
    } return false;
    }inline unsigned char GetRed(WORD color)
    {
    if( Is555 )
    return (color>>7) & 0xff;
    else
    return (color>>8) & 0xff;
    }inline unsigned char GetGreen(WORD color)
    {
    if( Is555 )
    return (color>>2) & 0xff;
    else
    return (color>>3) & 0xff;
    }

    inline unsigned char GetBlue(WORD color)
    {
    return (color & 0x1f) << 3;
    } ------------------------
    金点时空
    softboy
    2001.5.9
    http://www.gpgame.com
    ------------------------
      

  4.   

    to saucer(思归) 
    那个DEMO不能截另外一个全屏幕游戏的图.
    不知道为什么...
      

  5.   

    to Xcoder(流浪狗)
    我要截另一个用DirectX的程序的屏
      

  6.   

    我有普通截屏幕的VC代码,不知道能不能截DirectX?
    如果要,给我发一份mail告诉我, [email protected]
      

  7.   

    to kingofvc(还是喜欢97)我用这个程序截出来的图屏幕是画的,不知道为什么。
      

  8.   

    kingofvc的程序是用来截16位图的,好像还有一点问题,截出的屏幕是花的。
    我把它改成了截24位图的版本:好辛苦啊!试试看:inline unsigned char GetRed(char *pixel)
    {
    return (*pixel);
    }inline unsigned char GetGreen(char *pixel)
    {
    return (*(pixel+1));
    }

    inline unsigned char GetBlue(char *pixel)
    {
    return (*(pixel+2));
    }
    bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
    {
    char* lpBuffer; // 表面指针
    int nPitch;  // 表面跨距
    int nWidth, nHeight; // 表面宽高

    // 打开文件s
    FILE* fp;
    if( (fp=fopen(filename, "wb")) != NULL )
    {
    // 锁定表面
    DDSURFACEDESC ddsd;
    ddsd.dwSize = sizeof(ddsd);
    HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
    if( ddrval == DD_OK )
    {
       lpBuffer = (char *)ddsd.lpSurface;
    nWidth = ddsd.dwWidth;
    nHeight = ddsd.dwHeight;
    nPitch  = ddsd.lPitch >2; //lPitch以Byte为单位,GraphPitch以WORD为单位。所以GraphPitch = lPitch / 2;
    } // 保存文件头
    BITMAPFILEHEADER FileHeader;
    FileHeader.bfType = 'BM';
    FileHeader.bfSize = nWidth * nHeight * 3 + 0x36;
    FileHeader.bfReserved1 = 0;
    FileHeader.bfReserved2 = 0;
    FileHeader.bfOffBits = 0x36;
    fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

    // 保存文件信息
    BITMAPINFOHEADER Header;
    Header.biSize = sizeof(BITMAPINFOHEADER); // 结构的大小
    Header.biWidth = nWidth; // 宽
    Header.biHeight = nHeight; // 高
    Header.biPlanes = 1; // 固定
    Header.biBitCount = 24; // 颜色数
    Header.biCompression = BI_RGB; // 是否压缩
    Header.biSizeImage = nWidth * nHeight * 3; // 图片的大小
    Header.biXPelsPerMeter = 0;
    Header.biYPelsPerMeter = 0;
    Header.biClrUsed = 0;
    Header.biClrImportant = 0;
    fwrite(&Header, Header.biSize, 1, fp); // 写入具体内容(从下向上存放)
    fseek(fp, 0x36, SEEK_SET);

    FILE *wp;
    wp=fopen("d:\\debug.txt","w");
    fprintf(wp,"nHeight=%d\nnWidth=%d\n",nHeight,nWidth); for(int i=0; i<nHeight; i++)
    {
    lpBuffer = (char*)ddsd.lpSurface + nWidth*(nHeight-i-1)*3;
    fprintf(wp,"Before: %p\n",lpBuffer);
    for(int j=0; j<nWidth; j++)
    {
    fputc(GetRed(lpBuffer), fp); // 红
    fputc(GetGreen(lpBuffer), fp); // 绿
    fputc(GetBlue(lpBuffer), fp); // 蓝 //lpBuffer++;
    lpBuffer+=3;
    }
    fprintf(wp,"After: %p\n",lpBuffer);
    } fclose(wp);
    fclose(fp); // 解锁表面
    ddrval = lpSurface->Unlock( NULL );
    return true;
    } return false;
    }
      

  9.   

    I think it is useful