说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

利用Delphi的Tbitmap控件抓取屏幕图象

HTML文档下载 WORD文档下载 PDF文档下载
利用Delphi的Tbitmap控件抓取屏幕图象

相信绝大部分电脑爱好者都使用过不同种类的抓图软件抓取屏幕图形。在本文中,作者要向大家介绍的是利用Delphi的TBitmap控件进行屏幕上任意窗口图形的抓取。同时文章中还有如何利用Delphi的扩展消息处理功能为Delphi的窗口添加热键和在任务栏上添加图标的技巧。

程序的主要思路是:当按下为窗口建立的热键后,首先获得光标所在的窗口的矩形区域,然后建立一个TBitmap对象,将矩形区域复制到TBitmap对象中;最后利用TBitmap的图象保存Method将复制到TBitmap中的位图保存到磁盘中。

程序1是完整的源代码清单:

在运行程序前,首先要执行以下的步骤:

在Form1中加入一个TsavePictureDialog控件,将其Name设置为SavePic。

改变Form1的如下属性:

BorderStyle改变为bsNone;

FormStyle改变为fsStayOnTop;

Visable改变为False。

同时在Project1中的Application.Run语句前加入: Application.ShowMainForm := False;为了直观显示,还可以将Form1的Cursor属性设置为crHandPoint。

unit Unit1;  

interface

uses Windows

Messages

SysUtils

Classes

Graphics

Controls

Forms

Dialogs

StdCtrls

ExtCtrls

Menus

ExtDlgs

ClipBrd

ShellApi;

const

WM_ICONMESSAGE=WM_USER+100;

type

TForm1 = class(TForm)

SavePic: TSavePictureDialog;

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X

Y: Integer);

Private

//热键消息处理函数

procedure WMHOTKEY(var Message:TMessage);message WM_HOTKEY;

//任务栏消息处理函数

procedure WMBarIcon(var Message:TMessage);message WM_ICONMESSAGE;

public

end;

procedure CaptureControl;

var

Form1: TForm1;

tmpBitmap:TBitmap;

iBitmapValide:Boolean;

implementation

{$R *.DFM}

procedure CaptureControl;

var

iTempWnd

iMeHwnd

iDC:LongWord;

tyRect :TRect;

tpRect : TPoint;

iWidth

iHeight:integer;

begin

//获得光标位置

GetCursorPos(tpRect);

//获得光标所在位置的窗口句柄

iMeHwnd:=WindowFromPoint(tpRect);

//获得窗口的矩形区域

GetWindowRect(iMeHwnd

tyRect);

//获得桌面窗口的句柄

iTempWnd:=GetDesktopWindow;

iDC:=GetDC(iTempWnd);

iWidth:=tyRect.Right-tyRect.Left;

iHeight:=tyRect.Bottom-tyRect.Top;

//建立位图

tmpBitmap:=TBitmap.Create;

iBitmapValide:=True;

tmpBitmap.Width := iWidth;

tmpBitmap.Height := iHeight;

//复制窗口矩形区域到位图中

Bitblt(tmpBitmap.Canvas.Handle

0

0

iWidth

iHeight

iDC

tyRect.Left

tyRect.Top

SRCCOPY);

ReleaseDC(iTempWnd

iDC);

Form1.Visible := True;

//使Form1覆盖光标所在的窗口矩形

Form1.Left := tyRect.Left;

Form1.Top := tyRect.Top;

Form1.Width := iWidth;

Form1.Height := iHeight;

tyRect.Left:=0;

tyRect.Right := iWidth;

tyRect.Top:=0;

tyRect.Bottom:=iHeight;

//将位图绘制到Form1的Canvas中

Form1.Canvas.Draw(0

0

tmpBitmap);

//围绕Form1画出3个相素的红色边框

Frame3D(Form1.Canvas

tyRect

clRed

clRed

3);

end;

//响应热键,进行抓图

procedure TForm1.WMHOTKEY(var Message:TMessage);

begin

if iBitmapValide then

begin

tmpBitmap.FreeImage;

tmpBitmap.Free;

iBitmapValide:=False;

end;

CaptureControl;

end;

procedure TForm1.WMBarIcon (var Message:TMessage);

begin

if ((Message.LParam = WM_RBUTTONDOWN)or (Message.LParam = WM_LBUTTONDOWN)) then

//在任务栏图标上按下鼠标键退出

close;

end;

procedure TForm1.FormCreate(Sender: TObject);

var

lpData:PNotifyIconData;

begin

//注册热键为Ctrl+Shift+A

RegisterHotKey(Form1.handle

0

MOD_SHIFT OR MOD_CONTROL

65);

//在任务栏上建立图标

lpData := new(PNotifyIconDataA);

lpData.cbSize := 88;

lpData.Wnd := Form1.Handle;

lpData.hIcon := Form1.Icon.Handle;

lpData.uCallbackMessage := WM_ICONMESSAGE;

lpData.uID :=0;

lpData.szTip := '屏幕捕捉';

lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;

Shell_NotifyIcon(NIM_ADD

lpData);

dispose(lpData);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

var

lpData:PNotifyIconData;

begin

//退出时删除任务栏图标

lpData := new(PNotifyIconDataA);

lpData.cbSize := 88;

lpData.Wnd := Form1.Handle;

lpData.hIcon := Form1.Icon.Handle;

lpData.uCallbackMessage := WM_ICONMESSAGE;

lpData.uID :=0;

lpData.szTip := '屏幕捕捉';

lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;

Shell_NotifyIcon(NIM_DELETE

lpData);

dispose(lpData);

//退出时注销窗口热键

UnRegisterHotKey(Form1.Handle

0);

if iBitmapValide then

begin

tmpBitmap.FreeImage;

tmpBitmap.Free;

iBitmapValide:=False;

end;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X

Y: Integer);

begin

//按下鼠标左键保存窗口图象

if (Button=mbLeft)then

with SavePic do

begin

DefaultExt := 'Bmp';

Execute;

if FileName<>'' then

tmpBitmap.SaveToFile(FileName);

end;

//保存完图象后删除位图

tmpBitmap.FreeImage;

tmpBitmap.Free;

iBitmapValide:=False;

Form1.Visible := False;

end;

end.

按F9键运行程序,将光标移动到任意窗口上按下热键Ctrl+Shift+A,则光标所在窗口被捕捉下来(同时被捕捉区域被红色边框框住作为标识)。在框内按下鼠标左键就可以保存位图图像。这个程序也可以用来捕捉菜单。

同时程序也可以将图象发送到剪贴板中,只要将上面程序中Form1的OnMouseUp事件置换为下面的程序段就可以了(程序2):

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X

Y: Integer);

var

MyFormat : Word;

AData : THandle;

APalette : HPALETTE;

begin

if (Button=mbLeft)then

//按下鼠标左键将tmpBitmap中的内容发送的剪贴板

begin

tmpBitmap.SaveToClipBoardFormat(MyFormat

AData

APalette);

ClipBoard.SetAsHandle(MyFormat

AData);

end;

tmpBitmap.FreeImage;

tmpBitmap.Free;

iBitmapValide:=False;

Form1.Visible := False;

end;

以上的程序在Windows95,Delphi4.0下运行通过。

专访友盟CEO叶谦:深挖海量终端用户数据的价值 七牛资深前端工程师马逸清:前端测试探索实践 实战iOS 9:开发者必须掌握的三种搜索API 腾讯Bugly干货分享:浅谈Swift在实际项目中的应用 【前端人生】ThoughtWorks黄峰达:利用横向扩展方式,快速学习前端新框架 这是前端最好的时代——论前端的“三化”建设 游戏引擎网络开发者的64做与不做(一):客户端方面 六问七牛CDN:打造融合CDN管理服务平台 《近匠》Wilddog野狗,跨平台的实时通信云服务 【CTO讲堂】招人不易留人更难——创业团队要闯哪些关? iOS UIView动画实践(四):过渡与伪3D动画 日程全公布|年度人工智能技术精英聚会 7月26-27相约北京 TypeScript 1.5发布,支持大量ES6新特性 快快快!27个提升效率的iOS开源库推荐 《近匠》Maxense,“云+传感”推动产业变革 【探秘ES6】系列专栏(九):使用Babel和Broccoli 2015年Postgres全球开发者大会参会总结 英特尔硬享公社启动“创意原型拍卖” 对接创意与商机 详解Swift 2.0(一):苹果做的25项改变 2015甲骨文数据库大会:回顾、感恩、展望,欲续写辉煌 Nokia进军VR领域:让人欢喜让人忧 2015中国人工智能大会在京成功召开 成为糟糕游戏设计师的五种打开方式 Stripe使用指南:Swift开发中的信用卡支付 将安全延伸至云端以及更远的地方 专访FreeWheel北京研发中心:一流技术型人才应具有国际化视野 iOS UIView动画实践(五):Keyframe Animation 【CTO讲堂】简说创业公司的技术选型,从BearyChat的开发说起 《近匠》Webix,跨浏览器的JavaScript UI组件库 微软正式推送Windows 10,你会升级最后一款Windows产品? Cinatra:高性能现代C++ Web框架 关于c++若干概念的疑问? 好消息! 关于《Programming Windows with MFC》上的第一个例子,请教,急!!! 高分找软件! 请教:智能ABC输入法的词库保存在哪个文件里面? UNICODE的问题!? ISA问题讨论 让我么来谈谈今年的就业形式吧! 关于2000的2个经典问题。谁知道,请赐教。 系统漏洞and端口扫描的原理? 各位大虾和学习过sql语言的师兄们,小弟请求各位指点迷津!! 请问VARIANT是个什么东西? %%%一个很好的程序员网站%%%,来者都有分◎◎◎ 好烦,我想把高数过了。 请问怎么在文件中删除一行? 请教,用DBGrid连接ADOquery,想在DBGrid里用鼠标可以移动一条记录到另一条记录的上面或下面,应怎做呢? 当一个窗体被创建,被移动,被改变大小时,共发出了哪些消息? %%%一个很好的程序员网站%%%,来者都有分◎◎◎ 各位大虾和学习过sql语言的师兄们,小弟请求各位指点迷津!! %%%一个很好的程序员网站%%%,来者都有分◎◎◎ tikkypeng(一两狂死郎之天衣有缝)进来!!!! 在线等待,如何在DataGrid控件上更新数据? 关于datagrid问题 菜鸟求助 初学Delphi要怎么开始呢?望各位高手赐教! 画时钟,对你来说很容易,对我来说很那个.. xml中华网(www.xmlchina.net)—完全由ASP.net技术实现!! 关于文件二进制查找问题! 菜鸟有道数组问题请教!!!!!!help,help PreparedStatement为什么使用不了参数? 请教,在OUTLOOK中如何得到发信人的E-Mail Address 江苏 淮安的请进 建议程序员杂志对大连的程序员作一个调查 关于 New Collection 类型数组和列表框的问题(急!) 我現在遇到一個怪問題 怎么又冒出个Bug? 一个简单的数据库查询问题!50大洋送上!!急 谁能告诉我,反黄软件的原理是什么?? 请问如何读出一个dbf文件 如何从RM格式的电影中提取音乐? 怎么样 才能把一个数组转化为一个字符串啊 !!!请问我写的多线程CSocket连续接受用户请求的程序为什么不对?在线等。。/。 关于 New Collection 类型数组和列表框的问题(急!) 安装的中文版vs.net,调试c#程序时,提示不能调用类库,为什么? mstcpip.h哪儿有? 菜鸟的问题,请帮忙 .c and .cpp 一个关于mfc兼容性的问题? 翻译高手请进...... 求教:关于mp3算法的问题 这里的狗屁文章很多,不过看得让我笑个不停 孙中山为发动辛亥革命作出了什么组织上和思想上的准备 BeCl2和AlCl3为什么是共价化合物? 《墨经》中记载:“圆,一中同长也.”其中的“一中”指的是圆《》,它一般字母《》表示:“同长”表示圆所有( )相等. 是不是每一种元素都能与其他种类的元素组成物质? 为什么AlCl3、BeCl2是共价化合物?如题 这两种物质从概念来说应该是离子化合,为什么是共价化合物哪? "圆,一中同长也."这句话的意思是什么? 1905年,孙中山为发动辛亥革命作了什么组织上和思想上的准备? 对孙中山革命的的评价 我国古代名著《墨经》中记载:“圆一中同长也”是指圆( 以孙中山为首的资产阶级革命派为辛亥革命做了哪些准备? (1/2)下列各项产业群项目中,不属于化学研究范畴的是()A化学纤维的合成与加工B软件的开发与应用C钨的...(1/2)下列各项产业群项目中,不属于化学研究范畴的是()A化学纤维的合成与加工B 欲除去氯化钙溶液中含有的少量盐酸,在不使用指示剂的条件下,应加入的试剂是 a、石灰石粉末 b、石灰水 物质在发生化学变化中表现出的性质叫化学性质,请举例说明一下 下列各项产业群项目中,不属于化学研究范畴的是()A化学纤维的合成与加工B软件的开发与应用C钨的冶炼...下列各项产业群项目中,不属于化学研究范畴的是()A化学纤维的合成与加工B软件 “圜(圆),一中同长也”是什么意思? 【化学】“物质在化学变化中表现出来的性质叫做化学性质” (性质)二词如何理解?【化学】“物质在化学变化中表现出来的性质叫做化学性质” (性质)二词如何理解?【化学刚入门,有 不属于化学研究范畴的() A化学纤维的合成与加工 B钨的冶炼与加工 C软件的开发与应用 D橡胶的合成与加工 墨经 中的“圜,一中同长也. 【高中化学】甲苯是和液溴还是溴水反应? 你知道为什莫聚异戊二烯既可以使酸性高锰酸钾溶液褪色,又可以使溴水褪色,但是聚乙烯就不可以两者均可呢 欲除去氯化钙中的盐酸,需加入【】A石灰石粉末B生石灰粉磨C熟石灰粉末D金属钙 网络的传播介质的有哪几种类型 为什么AlCl3是共价化合物?如题1楼的回答还是不懂 孙中山是中国近代政治文明——共和制的重要催生人.他的学说是“内审中国之情势,外察世界之潮流,兼收众据材料并结合所学知识,指出孙中山的学说体现了怎样的特点? 化学物质溶于水,水的表面张力变化有哪几种类型! 为什么AlCl3是共价化合物?可有金属啊. 孙中山所说的“世界潮流”指的是什么? 物体运动状态的改变是指物体运动的?发生改变 介绍英国地理及气候,要详细,反正是关于地理方面的是英国的就行 孙中山所说的世界的潮流和人民的需要指的是什么 我们周围世界物质的 变化一般分两类,即什么和什么 谁能给我介绍一下关于英国的地理及气候?这里人气最旺, 孙中山先生:“世界潮流浩浩荡荡,顺我者昌逆我者亡”是什么意思?今天一个和尚到我家,在报纸上用毛笔提了这几个字.有什么弦外之音? 废旧物品的用途有几种类型 Al2O3是离子化合物还是共价化合物 醇氧化成醛的条件是什么 催化剂是什么 氧化成酸呢?最好提供举例方程式 化学性质是物质在化学变化中表现出来的性质如_、_ 醛可以与氧气在铜、加热的条件下氧化成酸吗 醇在催化剂Cu并有氧气时氧化为醛的方程式 乙醇举例 下列变化反映了物质的化学性质的是()A.水沸腾时能变成水蒸气 B.氧气在101kPa、-183℃时变成淡蓝色液体C.酒精容易挥发 D.二氧化碳能使澄清的石灰水变浑浊 氧气能氧化醛基吗RT,为什么? 液态氯化氢为啥不能导电?而熔融状态氢氧化钾能导电呢? 物质的化学性质一定不发生变化吗 某一元醇在红热铜丝催化作用下,最多可以被空气中的氧气氧化为四种不同的醛该一元醇的分子式可能为()A C4H10OB C5H12OC C6H14OD C7H16OCHO-取代在那些位置上 分子晶体在熔融状态下都不导电吗,比如氯化氢这种强电解质 元素和物质分类1氧化物的化学通性2酸的化学通性3碱的化学通性4盐的化学通性(举例:金属的化学通性1大多数金属可与氧气反应3fe+2O2=点燃=fe3o4.) 欲中和氯化钙溶液中的少量盐酸,在没有指示剂的条件下应选用的试剂是碳酸钙粉末 为什么不能是硝酸银 为什么说世界文明,唯有我先这是道历史题目.谁能回答啊? 下列革命团体,由孙中山创建的是( )①光复会 ②兴中会 ③同盟会 ④华兴会 欲将混有盐酸的氯化钙溶液中和至中性,在不用指示剂的条件下应加入 石灰石粉末 熟石灰 硫酸 生石灰 哪个 中华开国五千年神州轩辕自古传创造指南车平定蚩尤乱世界文明唯有我先.表达了孙中山对轩辕的什么感情? 孙中山的革命活动有哪些? 0.1%甲基红乙醇溶液如何配 孙中山为什么说世界文明唯有我失 下列与孙中山的革命活动不符合的是()A.建立中国同盟会B.领导辛亥革命,结束了封建制度C.担任中华民国临时大总统 醛和氧化铜反应生成什么?注意,是氧化铜! 孙中山为什么说 世界文明唯我先 含钠元素的物质分类1.写出所有含有钠元素物质的名称或化学式(高一范围)2.寻找分类依据3.分类4.这样分类有什么好处最好能以多种分类依据进行分类 物质在 中表现出来的性质叫做化学性质 物质 就表现出来的性质叫做物理性质 物理性质主要包括 ,,,等内如镁条具有银白色的金属光泽,是镁的 性质;镁条可以燃烧,是镁 的性质 氧化铜生成醛于什么反应?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘