vc屏幕截图|怎么用VC++实现屏幕截图
绝绝子27人阅读
❶ 怎么用VC 实现屏幕截图
http://blog.csdn.net/zhoujielunmi/article/details/8140887改成MFC版本即可。
❷ 用VC怎么截图
#define FINENAME "D:\\1.bmp"HDC hdc,hmemdc;HBITMAP hbitmap;hdc=GetDC(hwnd);hmemdc=CreateCompatibleDC(hdc);//创建与hdc兼容的内存DCSelectObject(hmemdc,hbitmap);//将hdc的图象复制到内存DC,这样hbitmap所标识的位图的LPVOIDbmBits就有图象数据了BitBlt(hmemdc,0,0,COPYRIGHT-COPYLEFT,COPYBOTTOM-COPYTOP,hdc,COPYLEFT,COPYTOP,SRCCOPY);CreateBMPFile(FILENAME,hbitmap,hdc);DeleteDC (hmemdc);int CreateBMPFile(LPTSTR pszFile, HBITMAP hbitmap, HDC hdc){ PBITMAPINFO pbi;//位图信息 BITMAP bitmap;//位图对象 int cClrBits;//每个像素的颜色位数 BITMAPFILEHEADER bitmapfileheader; FILE *fp; BYTE *pimagedata;//获得位图信息,不包括图象数据 if (!GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap))//如果失败返回0 { MessageBox(NULL,TEXT("GetObject错误"),NULL,MB_OK); return 0; } //色彩平面数*每图素的色彩位数, 1<< cClrBits表示总颜色数 cClrBits = (WORD)(bitmap.bmPlanes*bitmap.bmBitsPixel); //分配内存 if(cClrBits != 24) { pbi=(PBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<< cClrBits)); } else { pbi=(PBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER));//24位位图没有调色板 } if(!pbi) { MessageBox(NULL,TEXT("内存不足"),TEXT("ERROR!"),MB_OK); return 0; }//填充位图信息头 pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);//位图信息头的大小 pbi->bmiHeader.biWidth = bitmap.bmWidth; pbi->bmiHeader.biHeight = bitmap.bmHeight; pbi->bmiHeader.biPlanes = bitmap.bmPlanes; pbi->bmiHeader.biBitCount = bitmap.bmBitsPixel; pbi->bmiHeader.biClrUsed = (1<<cClrBits); //使用的颜色数 pbi->bmiHeader.biCompression = BI_RGB;//位图没有压缩,设置标志 //计算位图数据大小,每一行所占的字节为4的倍数 pbi->bmiHeader.biSizeImage = ((pbi->bmiHeader.biWidth*cClrBits/8+3) & ~3)* pbi->bmiHeader.biHeight; pbi->bmiHeader.biClrImportant = 0;//填充文件头 bitmapfileheader.bfType=0x4d42;//标识文件的类型,规定为BM bitmapfileheader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+pbi->bmiHeader.biClrUsed*sizeof(RGBQUAD);//图象数据偏移 bitmapfileheader.bfSize=bitmapfileheader.bfOffBits+pbi->bmiHeader.biSizeImage;//总文件大小 bitmapfileheader.bfReserved1=0;//保留字,未使用 bitmapfileheader.bfReserved2=0;//创建文件 fp=_tfopen(pszFile,TEXT("wb+")); if(!fp) { MessageBox(NULL,TEXT("无法创建文件"),TEXT("ERROR!"),MB_OK); return 0; }//写入文件头 if(fwrite(&bitmapfileheader,sizeof(BITMAPFILEHEADER),1,fp)==0) { MessageBox(NULL,TEXT("磁盘已满"),TEXT("ERROR!"),MB_OK); return 0; }//写入位图信息 if(fwrite(pbi,sizeof(BITMAPINFOHEADER)+pbi->bmiHeader.biClrUsed*sizeof(RGBQUAD),1,fp)==0) { MessageBox(NULL,TEXT("磁盘已满"),TEXT("ERROR!"),MB_OK); return 0; }//写入位图数据 pimagedata=(BYTE *)malloc(pbi->bmiHeader.biSizeImage); if(!pimagedata) { MessageBox(NULL,TEXT("内存不足"),TEXT("ERROR!"),MB_OK); return 0; } if (!GetDIBits(hdc,hbitmap,0,pbi->bmiHeader.biHeight,pimagedata,pbi,DIB_RGB_COLORS)) { MessageBox(NULL,TEXT("获取位图数据失败"),TEXT("ERROR!"),MB_OK); return 0; } if(fwrite(pimagedata,pbi->bmiHeader.biSizeImage,1,fp)==0) { MessageBox(NULL,TEXT("磁盘已满"),TEXT("ERROR!"),MB_OK); return 0; }//关闭文件 if(fclose(fp)) { MessageBox(NULL,TEXT("文件无法关闭"),TEXT("ERROR!"),MB_OK); return 0; }//释放内存 free(pbi); free(pimagedata); return 1;}
❸ 如何用VC截屏,并在窗口中显示出来
hdc desktopDC=GerDC(NULL);Bitblt(自己窗口的DC,………… desktopDC);
❹ VC++截图方法
HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect){ HDC hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap,hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 位图宽度和高度 // 确保选定区域不为空矩形 if (IsRectEmpty(lpRect)) return NULL; // 获得选定区域坐标 nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; nWidth = nX2 - nX; nHeight = nY2 - nY; //为指定设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 创建一个与指定设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY); //BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY); //得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除 DeleteDC(hMemDC); DeleteObject(hOldBitmap); // 返回位图句柄 return hBitmap;}//把HBITMAP保存成位图BOOL SaveBmp(HBITMAP hBitmap, CString FileName){ HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal,hOldPal=NULL;
❺ VC++优化截屏如何实现
两种方法。第二种:参考一位网友的。MFC中就有截取屏幕的相关函数:ScrDC.CreateDC("DISPLAY", NULL, NULL, NULL);具体函数如下://存储背景图片(成员变量)CBitmap* m_pBackBitmap;/******************************** 拷贝屏幕固定区域* 参数:* xStartPt - 拷贝屏幕的起始点X坐标* yStartPt - 拷贝屏幕的起始点Y坐标* width - 拷贝宽度* height - 拷贝高度* xToCopy - 拷贝目的地的起始点X坐标* yToCopy - 拷贝目的地的起始点Y坐标*******************************/void CMyFun::CopyScreenToBitmap(xStartPt, yStartPt, width, height, xToCopy, yToCopy){ //NEW资源(调用一次重新拷贝一次) if (m_pBackBitmap != NULL) { delete m_pBackBitmap; m_pBackBitmap = NULL; } m_pBackBitmap = new CBitmap(); CDC ScrDC,MemDC; ScrDC.CreateDC("DISPLAY", NULL, NULL, NULL); MemDC.CreateCompatibleDC(&ScrDC); m_pBackBitmap->CreateCompatibleBitmap(&ScrDC,width,height); MemDC.SelectObject(m_pBackBitmap); //开始拷贝 MemDC.BitBlt(xStartPt, yStartPt, width, height,&ScrDC,xToCopy,yToCopy,SRCCOPY); ScrDC.DeleteDC(); MemDC.DeleteDC();}调用函数,实现截取全屏: //取的屏幕分辨率int width = ::GetSystemMetrics(SM_CXSCREEN);int height = ::GetSystemMetrics(SM_CYSCREEN);this->CopyScreenToBitmap(0,0,width,height,0,0);//这时m_pBackBitmap指向的CBitmap对象就存着全屏的图象了第一种:先截取屏幕保存为BMP格式文件,然后在VC资源中导入该位图。 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1为导入位图的ID。 CDC dc; dc.CreateCompatibleDC(pDC); //创建兼容DC dc.SelectObject(&bitmap); //选进设备表 BITMAP bmp; bitmap.GetBitmap(&bmp); CRect rect; GetClientRect(&rect); pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY); //注意参数SRCCOPY
❻ 用VC++6.0做一个小型屏幕截图程序
很多软件有这种功能,如qq、抓图工具,不过这种源代码很稀少哦,一般不会外泄的。而且这么有难度的问题居然一点悬赏分都不给。
❼ VC++执行结果怎么截图
代码给你随便贴一段吧:HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect){ HDC hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap,hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 位图宽度和高度 // 确保选定区域不为空矩形 if (IsRectEmpty(lpRect)) return NULL; // 获得选定区域坐标 nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; nWidth = nX2 - nX; nHeight = nY2 - nY; //为指定设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 创建一个与指定设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY); //BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY); //得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除 DeleteDC(hMemDC); DeleteObject(hOldBitmap); // 返回位图句柄 return hBitmap;}//把HBITMAP保存成位图BOOL SaveBmp(HBITMAP hBitmap, CString FileName){ HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal,hOldPal=NULL; //计算位图文件每个像素所占字节数 hDC = CreateDC("DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else wBitCount = 24; GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrImportant = 0; bi.biClrUsed = 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, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 设置位图文件头 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 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); return TRUE;}
❽ 怎么用VC++实现屏幕截图
可以,而且不是非常复杂,但是,我建议你学习一下基本的Windows API程序设计。不然以后会碰到无穷无尽的问题,没有这个基础,是不行的。代码给你随便贴一段吧:HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect){ HDC hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap,hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 位图宽度和高度 // 确保选定区域不为空矩形 if (IsRectEmpty(lpRect)) return NULL; // 获得选定区域坐标 nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; nWidth = nX2 - nX; nHeight = nY2 - nY; //为指定设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 创建一个与指定设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY); //BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY); //得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除 DeleteDC(hMemDC); DeleteObject(hOldBitmap); // 返回位图句柄 return hBitmap;}//把HBITMAP保存成位图BOOL SaveBmp(HBITMAP hBitmap, CString FileName){ HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal,hOldPal=NULL; //计算位图文件每个像素所占字节数 hDC = CreateDC("DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else wBitCount = 24; GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrImportant = 0; bi.biClrUsed = 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, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 设置位图文件头 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 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); return TRUE;}
评论 | 0 条评论
登录之后才可留言,前往登录