<Win32_9>有意思的程序——抓取屏幕
Win32学了一段时间了,跟着杨老师的脚步,准备学习MFC,因此最近几天在复习C++,于是发现有将近一周没写博文了……
今天来写一个较为简单、但是比较有意思的东西
不知大家在理发店理发的时候注意到一个奇观没:
理发店一般都有两面对立的镜子,你仔细一看会发现,两面镜子里面的成像逐渐缩小,并且居中排列,很有意思
盗梦空间中也有一个类似的场景,我截了一个图:
yes,今天就来做一个这样的效果,只不过是抓的屏幕
好吧,先来看看程序运行效果,来对比一下:
下面进入主题,剖析实现细节,主要分两大步:
(1)要对屏幕"工作",在Win32中必须获取屏幕的hdc。有两种主要的方式:
1)GetDC(HWND), 传递参数NULL——GetDC(NULL)
2)CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
(2)贴图
获取环境hdc后,在hdc中会保存屏幕的状态——相当于屏幕的截图,只是用bmp保存的
今天贴图用一个更好的函数StretchBlt,它有一个很好的功能——可以按比例缩放bmp位图,然后显示:
BOOL StretchBlt(
HDC hdcDest, // handle to destination DC
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
DWORD dwRop // raster operation code
);使用方法和BitBlt很类似,应该不用赘述了……
具体核心实现代码如下:
int cxScreen, cyScreen;//全局变量——屏幕的长宽,用于窗口居中和缩放显示bmp
hdcCli = BeginPaint(hwnd, &ps); hdcScr = GetDC(NULL); //循环3次 i = 0;
while(i<3)
{
//按比例显示桌面截图
StretchBlt(hdcCli, 0, 0, cxClient, cyClient, hdcScr, 0, 0, cxScreen, cyScreen, SRCCOPY);
i++;
} DeleteDC(hdcScr);
EndPaint(hwnd, &ps);
这种方式很简单,当然我肯定不会简单用一下这个函数就了事了,这个没什么大不了的,下面我在介绍一种使用GDI映射模式+BitBlt来贴bmp位图,实现效果和上面说的完全一样
BitBlt函数没有缩放功能,我就用映射模式来实现缩放功能,缩放的具体实现代码如下:
hdcCli = BeginPaint(hwnd, &ps); hdcScr = GetDC(NULL); SetMapMode(hdcCli, MM_ANISOTROPIC);//设定x、y方向异性模式,就是说x、y方向可以不同
SetWindowExtEx(hdcCli, cxScreen, cyScreen, NULL);//设定窗口范围
SetViewportExtEx(hdcCli, cxClient, cyClient, NULL);//设定视口范围
//这样就能将cxScreen * cyScreen的大小缩放为cxClient * cyClient的大小,就是将屏幕大小缩小为客户区大小
//循环3次
i = 0;
while(i<3)
{
//由于已经在内存中缩放了屏幕bmp位图,这里就可直接贴图
BitBlt(hdcCli, 0, 0, cxScreen, cyScreen, hdcScr, 0, 0, SRCCOPY);//直接显示
i++;
} DeleteDC(hdcScr);
EndPaint(hwnd, &ps);
这两种方式实现的效果完全一样,多一种方式,多一种思路,这样才能提高能力……
源代码待会儿上传……
<Win32_9>有意思的程序——抓取屏幕的更多相关文章
- PowerShell定时抓取屏幕图像
昨天的博文写了定时记录操作系统行为,其实说白了就是抓取了击键的记录和对应窗口的标题栏,而很多应用程序标题栏又包含当时记录的文件路径和文件名,用这种方式可以大致记录操作了哪些程序,打开了哪些文 ...
- 跟我一起玩Win32开发(22):抓取屏幕
关于如何拷贝屏幕并保存,这里已经有现成的例子,我也不必去Copy人家了,我一向不喜欢Copy.这里有一个完整的例子,可以看看. http://msdn.microsoft.com/EN-US/libr ...
- 最近买了个kindle,为了方便阅读,写了个程序抓取网页内容发送到Kindle
主要觉得往kindle里加书籍太麻烦了,要下载下来,还要通过邮件发送,特别一些网页文字版的书籍没办法放到kindle里,所以想着还不如自己动手丰衣足食,写一个程序直接抓取网页内容,制作成书籍,然后自动 ...
- Java小程序--抓取emai
一.实现思路 1.使用Java.net.URL对象,绑定网络上某一个网页的地址 2.通过java.net.URL对象的openConnection()方法获得一个HttpConnection对象 3. ...
- 抓取屏幕并压缩生成HBITMAP
HBITMAP GetScreenBmp() { HWND hwnd = ::GetDesktopWindow(); HDC hsrc = ::GetDC(hwnd); HDC hmemdc = :: ...
- php远程抓取网站图片并保存
以前看到网上别人说写程序抓取网页图片的,感觉挺神奇,心想什么时候我自己也写一个抓取图片的方法! 刚好这两天没什么事,就参考了网上一个php抓取图片代码,重点借鉴了 匹配img标签和其src属性正则的写 ...
- 抓取“矢量”的实时交通流量数据
1. 引言 最近老师有一个需求,就是想要抓取实时的矢量交通流量数据来做分析,类似于百度地图,高德地图的"实时路况"那种.平时的网络抓取工作一般是抓取网页上现成的数据,但是交通流量数 ...
- Python 爬虫抓取代理IP,并检测联通性
帮朋友抓了一些代理IP,并根据测试联的通性,放在了不通的文件夹下.特将源码分享 注意: 1,环境Python3.5 2,安装BeautifulSoup4 requests 代码如下: 1 2 3 4 ...
- python3+beautifulSoup4.6抓取某网站小说(四)多线程抓取
上一篇多文章,是二级目录,根目录"小说",二级目录"作品名称",之后就是小说文件. 本篇改造了部分代码,将目录设置为根目录->作者目录->作品目录- ...
随机推荐
- Spring Remoting by HTTP Invoker Example--reference
Spring provides its own implementation of remoting service known as HttpInvoker. It can be used for ...
- wildcard
[rusky@rhel7 test]$ lstest1 test123 test2 test317 test33 test335 test336 test44 testtest[rus ...
- 你真的了解 console 吗
对于前端开发者来说,在开发过程中需要监控某些表达式或变量的值的时候,用 debugger 会显得过于笨重,取而代之则是会将值输出到控制台上方便调试.最常用的语句就是console.log(expres ...
- [转]在 SQL Server 2008 中新建用户登录并指定该用户的数据库
提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 ----------------------------------- 正 文 ...
- shell 中 2>&1 的使用
一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |). 2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes ` ...
- 在浏览器中打不开Oracle 11gR2的企业管理器页面
最简单的办法,重建EM 四个步骤: emca -repos drop emca -repos create emca -config dbcontrol db emctl start dbconsol ...
- C++ 文本读写
写文件: ofstream of; of.open("test.txt"); string content = "abcd"; of.write(content ...
- 关于Visual Studio中的TraceDebugging文件夹
最近一段时间发现C盘莫名其妙的变小了,各种清理各种卸载还是没用,电脑慢的是在无法使用 .最后只能一个文件夹一个文件夹的找,最后针对“C:\Documents and Settings\All User ...
- Mysql 查询性能优化
查询优化,索引优化,库表结构优化需要齐头并进,一个不能落. 为什么查询速度会慢 在阐释编写快速的查询之前,需要清楚一点,真正重要的是响应时间.如果把查询看做是一个任务的话,那么它由一系列子任务构成,每 ...
- 关于webApi302跳转的问题
之前会出现"服务器无法在已发送 HTTP 标头之后设置状态"的问题,本地调试不报错,但是上产线就会报错 解决的思路是: var response = Request.CreateR ...