基于visual c++之windows核心编程代码分析(40)实现屏幕截取
来源:互联网 发布:正规的淘宝模特公司 编辑:程序博客网 时间:2024/05/22 00:12
屏幕截取器(Screen scraper)是允许一台 PC 来从主机上截取基于字符的数据和显示它在一个更容易了解的图形用户界面(GUI)上的一类软件。现在更新的屏幕截取器在 HTML 上显示信息,因此它能够用一个浏览器来访问。区别屏幕截取与常规剖析的关键因素在于被截取的输出是名义上送给人类消费,而不是机器解释。有很多屏幕截取的同义词在那里:数据抓取、数据萃取、网络抓取、网页包装和 HTML 抓取(后四个特定用于抓取 web 页面)。
我们都体验过QQ的截图功能特别好使,下面我们亲自来实践基于C++开发一个我们自己的截图功能。
请见代码讲解。
#include<windows.h>HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal,DWORD * sizeimage) ;BOOL CapScreen(LPTSTR FileName);//截屏函数HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal,DWORD * sizeimage) { BITMAP bm; BITMAPINFOHEADER bi; LPBITMAPINFOHEADER lpbi; DWORD dwLen; HANDLE hDib; HANDLE handle; HDC hdc; //不支持BI_BITFIELDS类型 if( dwCompression == BI_BITFIELDS ) return NULL; //如果调色板为空,则用默认调色板 if (hPal==NULL) hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE ); //获取位图信息 GetObject(bitmap,sizeof(bm),(LPSTR)&bm); //初始化位图信息头 bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bm.bmWidth; bi.biHeight = bm.bmHeight; bi.biPlanes = 1; bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel; bi.biCompression = dwCompression; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; //计算信息头及颜色表大小 int ncolors = (1 << bi.biBitCount); if( ncolors> 256 ) ncolors = 0; dwLen = bi.biSize + ncolors * sizeof(RGBQUAD); // we need a device context to get the dib from hdc = GetDC(NULL); hPal = SelectPalette(hdc,hPal,FALSE); RealizePalette(hdc); //为信息头及颜色表分配内存 hDib = GlobalAlloc(GMEM_FIXED,dwLen); if (!hDib){ SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc); return NULL; } lpbi = (LPBITMAPINFOHEADER)hDib; *lpbi = bi; //调用 GetDIBits 计算图像大小 GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight, (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS ); bi = *lpbi; //图像的每一行都对齐(32bit)边界if (bi.biSizeImage == 0){ bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight; if (dwCompression != BI_RGB) bi.biSizeImage = (bi.biSizeImage * 3) / 2; } //重新分配内存大小,以便放下所有数据 dwLen += bi.biSizeImage; if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE)) hDib = handle; else{ GlobalFree(hDib); //重选原始调色板 SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc); return NULL; } //获取位图数据 lpbi = (LPBITMAPINFOHEADER)hDib; //最终获得的DIB BOOL bgotbits = GetDIBits( hdc, bitmap, 0L, //扫描行起始处 (DWORD)bi.biHeight, //扫描行数 (LPBYTE)lpbi //位图数据地址 + (bi.biSize + ncolors * sizeof(RGBQUAD)), (LPBITMAPINFO)lpbi, //位图信息地址 (DWORD)DIB_RGB_COLORS); //颜色板使用RGB if( !bgotbits ) { GlobalFree(hDib); SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc);return NULL; } SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc);*sizeimage=bi.biSizeImage; return hDib;} BOOL CapScreen(LPTSTR FileName){DWORD sizeimage;HDC hdc = CreateDC("DISPLAY", NULL, NULL, NULL); HDC CompatibleHDC = CreateCompatibleDC(hdc); HBITMAP BmpScreen = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES)); SelectObject(CompatibleHDC, BmpScreen);BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY);HANDLEpbitmapwithoutfileh=DDBtoDIB(BmpScreen, BI_RGB,0,&sizeimage);BITMAPFILEHEADER bfh; //设置位图信息头结构bfh.bfType = ((WORD)('M'<< 8)|'B');bfh.bfReserved1 = 0;bfh.bfReserved2 = 0;bfh.bfSize = 54+sizeimage;bfh.bfOffBits = 54;//创建位图文件 HANDLE hFile=CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);DWORD dwWrite;// 写入位图文件头WriteFile(hFile,&bfh,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);// 写入位图文件其余内容WriteFile(hFile,pbitmapwithoutfileh,bfh.bfSize,&dwWrite,NULL); DeleteDC(hdc); CloseHandle(CompatibleHDC);return true;}int main(void){CapScreen("d:\\desktop.bmp");return 0;}
- 基于visual c++之windows核心编程代码分析(40)实现屏幕截取
- 基于visual c++之windows核心编程代码分析(40)实现屏幕截取
- 基于visual c++之windows核心编程代码分析(40)实现屏幕截取
- 基于visual c++之windows核心编程代码分析(11)实现屏幕截取
- 基于visual c++之windows核心编程代码分析(11)实现屏幕截取
- 基于Visual C++之Windows核心编程代码分析(2)实现Windows用户管理
- 基于Visual C++之Windows核心编程代码分析(2)实现Windows用户管理
- 基于Visual C++之Windows核心编程代码分析(2)实现Windows用户管理
- 基于visual c++之windows核心编程代码分析(48)编程实现远程登录3389
- 基于visual c++之windows核心编程代码分析(59)实现网络简单代理编程
- 基于visual c++之windows核心编程代码分析(48)编程实现远程登录3389
- 基于Visual C++之Windows核心编程代码分析(1)实现设备管理器枚举设备
- 基于Visual C++之Windows核心编程代码分析(3)实现程序自动安装
- 基于visual c++之windows核心编程代码分析(10)实现socket通信
- 基于visual c++之windows核心编程代码分析(26)实现文件关联
- 基于visual c++之windows核心编程代码分析(28)实现开机自启动
- 基于visual c++之windows核心编程代码分析(29)ICMP实现远程控制
- 基于visual c++之windows核心编程代码分析(33)实现防火墙模型
- 多边形游戏
- 学位的重要性
- 2012新年第一贴
- 智能定投的最优前提:始于熊市终于牛市
- 2011,那些值得的回忆
- 基于visual c++之windows核心编程代码分析(40)实现屏幕截取
- Windows程序设计__孙鑫C++Lesson2《掌握C++》 .
- Android模拟器学framework和driver之传感器篇1(linux sensor driver)
- 基于visual c++之windows核心编程代码分析(41)实现反向连接后门
- GDB基本命令(整合)
- qt的拖放
- POJ1664 放苹果 递归
- 银行女理财专员的定投心得
- 新年快乐!