找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4922|回复: 1

[开源] 屏幕截取代码

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-7-23 22:53:29 | 显示全部楼层 |阅读模式

  1. #include<windows.h>
  2. HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage) ;
  3. BOOL CapScreen(LPTSTR FileName);//截屏函数
  4. HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage)
  5. {
  6.     BITMAP            bm;
  7.     BITMAPINFOHEADER    bi;
  8.      LPBITMAPINFOHEADER     lpbi;
  9.     DWORD            dwLen;
  10.     HANDLE            hDib;
  11.     HANDLE            handle;
  12.     HDC             hdc;
  13.     //不支持BI_BITFIELDS类型
  14.     if( dwCompression == BI_BITFIELDS )
  15.         return NULL;
  16.     //如果调色板为空,则用默认调色板
  17.     if (hPal==NULL)
  18.         hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );
  19.     //获取位图信息
  20.     GetObject(bitmap,sizeof(bm),(LPSTR)&bm);
  21.     //初始化位图信息头
  22.     bi.biSize        = sizeof(BITMAPINFOHEADER);
  23.     bi.biWidth        = bm.bmWidth;
  24.     bi.biHeight         = bm.bmHeight;
  25.     bi.biPlanes         = 1;
  26.     bi.biBitCount        = bm.bmPlanes * bm.bmBitsPixel;
  27.     bi.biCompression    = dwCompression;
  28.     bi.biSizeImage        = 0;
  29.     bi.biXPelsPerMeter    = 0;
  30.     bi.biYPelsPerMeter    = 0;
  31.     bi.biClrUsed        = 0;
  32.     bi.biClrImportant    = 0;
  33.     //计算信息头及颜色表大小
  34.     int ncolors = (1 << bi.biBitCount); if( ncolors> 256 )
  35.         ncolors = 0;
  36.     dwLen  = bi.biSize + ncolors * sizeof(RGBQUAD);
  37.     // we need a device context to get the dib from
  38.     hdc = GetDC(NULL);
  39.     hPal = SelectPalette(hdc,hPal,FALSE);
  40.     RealizePalette(hdc);
  41.     //为信息头及颜色表分配内存
  42.     hDib = GlobalAlloc(GMEM_FIXED,dwLen);
  43.     if (!hDib){
  44.         SelectPalette(hdc,hPal,FALSE);
  45.         ReleaseDC(NULL,hdc);
  46.         return NULL;
  47.     }
  48.     lpbi = (LPBITMAPINFOHEADER)hDib;
  49.     *lpbi = bi;
  50.     //调用 GetDIBits 计算图像大小
  51.     GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,
  52.             (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );
  53.     bi = *lpbi;
  54.     //图像的每一行都对齐(32bit)边界
  55.         if (bi.biSizeImage == 0){
  56.         bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
  57.                         * bi.biHeight;
  58.     if (dwCompression != BI_RGB)
  59.             bi.biSizeImage = (bi.biSizeImage * 3) / 2;
  60.     }
  61.     //重新分配内存大小,以便放下所有数据
  62.     dwLen += bi.biSizeImage;
  63.     if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))
  64.         hDib = handle;
  65.     else{
  66.         GlobalFree(hDib);
  67.         //重选原始调色板
  68.         SelectPalette(hdc,hPal,FALSE);
  69.         ReleaseDC(NULL,hdc);
  70.         return NULL;
  71.     }
  72.     //获取位图数据
  73.     lpbi = (LPBITMAPINFOHEADER)hDib;
  74.     //最终获得的DIB
  75.     BOOL bgotbits = GetDIBits( hdc, bitmap,
  76.                   0L,                      //扫描行起始处
  77.                 (DWORD)bi.biHeight,      //扫描行数
  78.                 (LPBYTE)lpbi             //位图数据地址
  79.                 + (bi.biSize + ncolors * sizeof(RGBQUAD)),
  80.                 (LPBITMAPINFO)lpbi,      //位图信息地址
  81.                 (DWORD)DIB_RGB_COLORS);  //颜色板使用RGB
  82.     if( !bgotbits )
  83.     {
  84.         GlobalFree(hDib);
  85.         
  86.         SelectPalette(hdc,hPal,FALSE);
  87.         ReleaseDC(NULL,hdc);
  88.                 return NULL;
  89.     }
  90.     SelectPalette(hdc,hPal,FALSE);
  91.     ReleaseDC(NULL,hdc);
  92.         *sizeimage=bi.biSizeImage;
  93.     return hDib;
  94. }
  95. BOOL CapScreen(LPTSTR FileName)
  96. {
  97.         DWORD sizeimage;
  98.         HDC hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
  99.         HDC CompatibleHDC = CreateCompatibleDC(hdc);
  100.         HBITMAP BmpScreen = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES));
  101.         SelectObject(CompatibleHDC, BmpScreen);
  102.         BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY);
  103.         
  104. HANDLE        pbitmapwithoutfileh=DDBtoDIB(BmpScreen, BI_RGB,0,&sizeimage);
  105.         BITMAPFILEHEADER bfh;
  106.    //设置位图信息头结构
  107.         bfh.bfType = ((WORD)('M'<< 8)|'B');
  108.         bfh.bfReserved1 = 0;
  109.         bfh.bfReserved2 = 0;
  110.         bfh.bfSize = 54+sizeimage;
  111.         bfh.bfOffBits = 54;
  112.         //创建位图文件   
  113. HANDLE  hFile=CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  114. DWORD dwWrite;
  115. // 写入位图文件头
  116. WriteFile(hFile,&bfh,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);
  117. // 写入位图文件其余内容
  118. WriteFile(hFile,pbitmapwithoutfileh,bfh.bfSize,&dwWrite,NULL);  
  119. DeleteDC(hdc);
  120.    
  121. CloseHandle(CompatibleHDC);
  122. return true;
  123. }
  124. int main(void)
  125. {
  126. CapScreen("d:\\desktop.bmp");
  127. return 0;
  128. }
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

0

主题

34

回帖

0

精华

铜牌会员

积分
44
发表于 2010-8-4 14:57:48 | 显示全部楼层
拿下,不说谢谢!~·····
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表