《VC++实现屏幕截取编程.pdf》由会员分享,可在线阅读,更多相关《VC++实现屏幕截取编程.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.Com浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.ComVC+VC+VC+VC+实现屏幕截取编程实现屏幕截取编程该文档由国内顶级该文档由国内顶级 ITIT 视频网络编程教育平台整理发布视频网络编程教育平台整理发布屏幕截取是令人比较感兴趣的事情.虽然现在有不少应用程序如 HYPERSNAP 等可以用来截取你所喜欢的屏幕画面,但是如果能把这个功能加到自己的程序中,就更能利用它强大的作用.-下面用 VC 来逐步介绍在 Windows95下的实现过程.首先我们要确定屏幕截取的区域,用LPRECT结构来定义.
2、可以截取一个窗口,或整个屏幕.以下代码把选定的屏幕区域拷贝到位图中.HBITMAP CopyScreenToBitmap(LPRECT lpRect)/lpRect 代表选定区域HDC hScrDC,hMemDC;/屏幕和内存设备描述表HBITMAP hBitmap,hOldBitmap;/位图句柄int nX,nY,nX2,nY2;/选定区域坐标int nWidth,nHeight;/位图宽度和高度int xScrn,yScrn;/屏幕分辨率/确保选定区域不为空矩形if(IsRectEmpty(lpRect)return NULL;/为屏幕创建设备描述表hScrDC=CreateDC(DIS
3、PLAY,NULL,NULL,NULL);/为屏幕设备描述表创建兼容的内存设备描述表hMemDC=CreateCompatibleDC(hScrDC);/获得选定区域坐标nX=lpRect-left;nY=lpRect-top;nX2=lpRect-right;nY2=lpRect-bottom;/获得屏幕分辨率xScrn=GetDeviceCaps(hScrDC,HORZRES);yScrn=GetDeviceCaps(hScrDC,VERTRES);浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.Com浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSi
4、n.Com/确保选定区域是可见的if(nX 0)nX=0;if(nY 0)nY=0;if(nX2 xScrn)nX2=xScrn;if(nY2 yScrn)nY2=yScrn;nWidth=nX2-nX;nHeight=nY2-nY;/创建一个与屏幕设备描述表兼容的位图hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);/把新位图选到内存设备描述表中hOldBitmap=SelectObject(hMemDC,hBitmap);/把屏幕设备描述表拷贝到内存设备描述表中BitBlt(hMemDC,0,0,nWidth,nHeight,hSc
5、rDC,nX,nY,SRCCOPY);/得到屏幕位图的句柄hBitmap=SelectObject(hMemDC,hOldBitmap);/清除DeleteDC(hScrDC);DeleteDC(hMemDC);/返回位图句柄return hBitmap;得到屏幕位图句柄以后,我们可以把屏幕内容粘贴到剪贴板上.if(OpenClipboard(hWnd)/hWnd 为程序窗口句柄/清空剪贴板EmptyClipboard();/把屏幕内容粘贴到剪贴板上,hBitmap 为刚才的屏幕位图句柄SetClipboardData(CF_BITMAP,hBitmap);/关闭剪贴板CloseClipboa
6、rd();我们也可以把屏幕内容以位图格式存到磁盘文件上.int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName)/hBitmap 为刚才的屏幕位图句柄浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.Com浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.Com/lpFileName 为位图文件名HDC hDC;/设备描述表int iBits;/当前显示分辨率下每个像素所占字节数WORD wBitCount;/位图中每个像素所占字节数/定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数DW
7、ORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize,dwWritten;BITMAP Bitmap;/位图属性结构BITMAPFILEHEADER bmfHdr;/位图文件头结构BITMAPINFOHEADER bi;/位图信息头结构LPBITMAPINFOHEADER lpbi;/指向位图信息头结构HANDLE fh,hDib,hPal,hOldPal=NULL;/定义文件,分配内存句柄,调色板句柄/计算位图文件每个像素所占字节数hDC=CreateDC(DISPLAY,NULL,NULL,NULL);iBits=GetDeviceCaps(hDC,BITS
8、PIXEL)*GetDeviceCaps(hDC,PLANES);DeleteDC(hDC);if(iBits =1)wBitCount=1;else if(iBits =4)wBitCount=4;else if(iBits =8)wBitCount=8;else if(iBits =24)wBitCount=24;/计算调色板大小if(wBitCount =8)dwPaletteSize=(1 wBitCount)*sizeof(RGBQUAD);/设置位图信息头结构GetObject(hBitmap,sizeof(BITMAP),(LPSTR)&Bitmap);bi.biSize=siz
9、eof(BITMAPINFOHEADER);bi.biWidth=Bitmap.bmWidth;bi.biHeight=Bitmap.bmHeight;浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.Com浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.Combi.biPlanes=1;bi.biBitCount=wBitCount;bi.biCompression=BI_RGB;bi.biSizeImage=0;bi.biXPelsPerMeter=0;bi.biYPelsPerMeter=0;bi.biClrUsed=0;bi.biClrImpo
10、rtant=0;dwBmBitsSize=(Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;/为位图内容分配内存hDib=GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER);lpbi=(LPBITMAPINFOHEADER)GlobalLock(hDib);*lpbi=bi;/处理调色板hPal=GetStockObject(DEFAULT_PALETTE);if(hPal)hDC=GetDC(NULL);hOldPal=SelectPalette(hDC
11、,hPal,FALSE);RealizePalette(hDC);/获取该调色板下新的像素值GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFOHEADER*)lpbi,DIB_RGB_COLORS);/恢复调色板if(hOldPal)SelectPalette(hDC,hOldPal,TRUE);RealizePalette(hDC);ReleaseDC(NULL,hDC);/创建位图文件fh=CreateFile(lpFileN
12、ame,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMALFILE_FLAG_SEQUENTIAL_SCAN,NULL);if(fh=INVALID_HANDLE_VALUE)return FALSE;/设置位图文件头浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.Com浪曦网-国内顶级 IT 视频网络编程教育平台 Www.LangSin.CombmfHdr.bfType=0 x4D42;/BMdwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
13、+dwPaletteSize+dwBmBitsSize;bmfHdr.bfSize=dwDIBSize;bmfHdr.bfReserved1=0;bmfHdr.bfReserved2=0;bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;/写入位图文件头WriteFile(fh,(LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER),&dwWritten,NULL);/写入位图文件其余内容WriteFile(fh,(LPSTR)lpbi,dwDIBSize,&dwWritten,NULL);/清除GlobalUnlock(hDib);GlobalFree(hDib);CloseHandle(fh);