- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows屏幕监控截图
windowsSDK实现 屏幕实时监控 热键截图 功能一.基本概念的了解为了实现实时屏幕显示的功能,首先学习了下《windows程序设计》的第14章,位图和位块的传输。理解了下位图和位块的区别,基本概念。概念一:位图与图元的区别:位图图元点阵矢量(位图与图元的主要区别就在这里了)容易失真不失真较大较小传输速度快传输速度慢概念二:与设备无关的位图DDB设备相关位图DIB设备无关位图windows编程里面提到,这两个概念有时候是很难区分的。所以我在这里就不具体讲解两者的区别了,对我们的功能实现应该没什么关系。但是因为这是个经常出现的字眼,所以这里先提一下。二.BitBlt函数接下来我们来看BitBlt函数,这个函数是我们这次功能实现的最关键的一个函数了~~~~BOOL BitBlt(__inHDC hdcDest,__inintnXDest,__inintnYDest,__inintnWidth,__inintnHeight,__inHDC hdcSrc,__inintnXSrc,__inintnYSrc,__inDWORD dwRop);参数虽然多,但是用起来不难hdcDest目标设备描述表nXDest目标起始x坐标位置nYDest目标起始y坐标位置nWidth宽度nHeight高度hdcSrc源设备描述表nXSrc源起始x坐标nYSrc源起始y坐标dwRop这个参数比较复杂,我们这里就是简单的原封不动的复制,所以使用了 SRCCOPY更多关于这个函数的用法,参照MSDN当然了,如果你想缩放图片,你还可以使用函数StretchBlt这个函数比BitBlt多了两个参数。在我的程序中,将屏幕的图像传输到我自己的程序中:hdcClient = BeginPaint (hwnd, ps);//获得目标(本程序)设备描述符hdcWindow = GetWindowDC (NULL);//获得源目标(屏幕)设备描述符BitBlt (hdcClient, 0, 0, cxClient, cyClient, hdcWindow , 0, 0, SRCCOPY);三.实时显示我通过设置定时器,每隔1ms刷新一次软件的客户区。当然发消息没有这么快。但是至少这样能保证已经达到了最快的更新速度。程序开始时触发定时器case WM_CREATE:SetTimer (hwnd, ID_TIMER, 100, TimerProc) ;return 0 ;定时器函数VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime){InvalidateRect(hwnd, NULL, NULL); //无效整个屏幕客户区,重绘客户区}当这个功能实现的时候,出现了一个很奇怪的问题~~~。给大家截个图看看当前效果:有很多镜像!~~~这样的结果是正确的。我如果把我的程序放到我的另一个显示器上面(我有两个显示屏),那么程序显示就正常了,显示的是我原来那个屏幕上的图像。四:保存bmp图片这里直接贴代码了:HBITMAP ScreenCapture(LPWSTR filename ,WORD BitCount,LPRECTlpRect){HBITMAP hBitmap;// 显示器屏幕DCHDC hScreenDC = CreateDC(LDISPLAY, NULL, NULL, NULL);HDC hmemDC = CreateCompatibleDC(hScreenDC);// 显示器屏幕的宽和高intScreenWidth = GetDeviceCaps(hScreenDC, HORZRES);intScreenHeight = GetDeviceCaps(hScreenDC, VERTRES);// 旧的BITMAP,用于与所需截取的位置交换HBITMAP hOldBM;// 保存位图数据PVOID lpvpxldata;// 截屏获取的长宽及起点INT ixStart;INT iyStart;INT iX;INT iY;// 位图数据大小DWORD dwBitmapArraySize;// 几个大小DWORD nBitsOffset;DWORD lImageSize ;DWORD lFileSize ;// 位图信息头BITMAPINFO bmInfo;// 位图文件头BITMAPFILEHEADER bmFileHeader;// 写文件用HANDLE hbmfile;DWORD dwWritten;// 如果LPRECT 为NULL 截取整个屏幕ixStart = iyStart = 0;iX = ScreenWidth;iY = ScreenHeight;// 创建B
文档评论(0)