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

利用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下运行通过。

搜狗开源内部项目管理系统Cynthia,已被数十家企业采用 沃游戏新版本全新登场 好友PK根本停不下来 腾讯发布首款智能硬件,内部筹建孵化器鼓励创新 触控开发者平台:孕育“十亿开发者俱乐部” 《近匠》大新伙伴:大姨吗防晒小助手,帮你呵护女神 专访阿里云总裁王文斌:做出“用得爽”的工程产品 专访AMD全球副总裁潘晓明:2014全线发力,力争中国市场 搜狗开源内部项目管理平台Cynthia意欲何为? 深度解析浪潮新八路服务器TS860 支持Box2D,开源HTML5 2D游戏引擎FLAG 一周消息树:从程序员到架构师的方法与逻辑 【CTO俱乐部走进海尔】海尔的转型探索之路 十一问MongoDB CTO,谈NoSQL人气王的扩展、事务及运维 腾讯“创业•密码”开发者论坛 ChinaJoy引爆创业者关注 从F1赛车到智能手机,无线充电技术之崛起 助力梦想!MDCC免费为优秀App开发团队提供展位 为Symfony2和Redis正名,基于PHP的10亿请求/周网站打造 【聚焦API】教你如何选择最适合的NLP API服务商? 直接改应用!Flipboard开源iOS应用内调试工具FLEX 专访腾讯游戏运营总经理崔晓春:云时代游戏运营的变革与创新 嵌入式专家Bruce Douglass经验谈 门票销售过半 从2014微信开发者大会购票者特征说起 当来自金星的Devs碰上火星的Ops——共话应用扩展 移动平台市场占有率:Android首次赶超iOS 豌豆荚范怀宇 I/O大会总结:Android无处不在 轻博客始祖Tumblr:哈希以支撑2.3万Blog请求/秒 《近匠》FIR.im:简单易用的内测分发工具 传苹果公司将于9月9日召开新一代iPhone发布会 近百家微信开发商参与征集评选活动 TOP10正浮出水面 Java程序猿,手游引擎怎么选? MDCC 2014优秀移动团队免费展位火热申请中 麻烦问一下,100分请笑纳 利用控件mscomm与单片机通信,怎样将单片机传来的二进制树显示出来 sql2000在客户机上备份和恢复数据库都会出现服务器的路径,请问它是怎么样获得服务器的路径的? 技嘉7VA主板(KT400)怎么开启AGP4X? 有关api函数多线程网络的问题 如何把图片框中的内容保存为一幅BMP的图片? 再次求助 pb打印设置的纸张大小设置问题 求各位鼎力相助 JSP中多个按钮提交,高手请进 非法游标状态是什么出错了 顶尖高手请进来 如何把建立在 visio 中的数据表导入导数据库中?谢谢!! 》如何进行关联?《 怎样把InterBase库里的表导出为文本文件? GetCurrentDirectory( ) 问题? 怎样将linux的smtp的指向另一台机器 散分!!!请问哪里有JBuild8.0解密程序或密码? AC'97声卡在安装小企鹅输入法后不能使用 用路由器能将一个外网的IP同进指向内部网的两个机器吗?(请详细解答一下好吗?) 一个Form两个登录怎么搞?? 送分来了!!哪位大侠能把这段delphi代码变成c++builder的代码?很简单的!! 怎么用NERO刻录可引导光盘 高手请来指导一下,很简单的小问题!! 高手接分! 求救!vbb的问题 关于变量和列的问题 对话框最小化时没有icon,在线等... 新手,怎样快速到实现处?急!!! 声卡装不上怎么解决????????????????????急急!!!!!!!!!!!!!!! 如何在程序中进行打印设置 如何将中文文字转换为图形 头疼啊,刚开始用 stl 写代码 就碰见了两个巨长的 warning 怎么解决呀 请帮我解释一下session的一些概念,最好最好详细解释一下. 有什么方法让combobox控件里的文本不可编辑? 在线提问,一个蔡鸟小问题。 客户端数据备份问题 网页的定时问? Microsoft.Web.UI.WebControls.dll的中文资料! label中如何显示多行 为什么这么久了排行榜上的分类排行还没有整理出来? 十万火急!!!!!!! 远程控制问题 求助高手:连接数据库时出现ORA-01031:insufficient privileges,如何解决? asp怎么写找回密码的程序 请帮帮我 划分某个端口为多个VLAN的问题 简单问题? 在服务端对HTML元素该如何进行操作? 帮我看一下! 紧急求:闪烁功能的源代码 日本进行冻结核污水实验 望解决污染水分析称政府再停摆凸显美国政治新焦点妻子选总统 洪都拉斯被罢黜总统或可重美国男子冲浪遭遇鲨鱼 用拳击技巧击将马来西亚妇女操作轿车不当误撞死邻居7俄达吉斯坦地方官员遇袭身亡租客伪造房产证卖掉了房子 新\"房东浙江省新增1例人感染H7N9禽流感病美情报局局长指有关美监听事件部分报道日本长崎附近海域发现元朝军队沉船遗骸研究称美国人网购母乳风险高 75%或大型枪击案频发 美拟采新策略应对“活联合国官员称澳森林大火与该国废除碳税芬兰一研究人员拟通过拍摄关注当地避难奥巴马演讲时扶住快要晕倒的孕妇被疑做奥巴马演讲时扶住快要晕倒的孕妇被疑做两股台风同袭 日本气象台长获权发布紧美媒:美9月就业数据不佳为美联储政策英国乔治小王子教父母共7人 多为威廉劝诫移民\"回家\"广告被谴责 英政两股台风同袭 日本气象台长获权发布紧男子买假军官证在医院免费治疗 骗取治3层楼上再盖3层高贵的坚守且看诺奖得主的“逃离”宁夏灭门案系婚姻纠纷引起穿越 城墙的武士许士庙街小学拾遗读史七问重新施划交通标线在西安当作家太幸福了咸阳三里桥客运站开建中韩传统服饰同台展现2032年小行星撞地球?报人的散文犀利而不刻薄延长养老缴费年限 更要提升公共投入清代的皇子教育办证“两重天”因权力失范世界冠军“藏”在孩子们当中今日夜间西安有阵雨心中的那片圣土“奴才”称谓今考
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘