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

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

改变VCL的行为--一个使用可视化元件的实例-Delphi资料 具有不同字体的列表框-Delphi资料 快速大量地更改控件内容-Delphi资料 快速动态创建MenuItem-Delphi资料 利用Delphi 5中调用Excel 97 利用Delphi的Tbitmap控件抓取屏幕图象 利用delphi美化你的菜单 面向组件的系统开发方法-Delphi资料 强大的树型编程控件TeeTree1.01-Delphi资料 确定MEMO控件中的当前行和列-Delphi资料 让字体左、右对齐-Delphi资料 如何给TListBox加上水平的滚动条?-Delphi资料 如何快速选择一个组件的父亲-Delphi资料 如何用Delphi编写自己的可视化控件 如何用VB创建控件-Delphi资料 生成程序组和项-Delphi资料 实现超级链接-Delphi资料 实战Delphi数据网格色彩特效 使dbgrid的某几笔资料变色-Delphi资料 树形图(Treeview)的使用概述-Delphi资料 透明FORM-Delphi资料 为列表框添光彩-Delphi资料 限制FORM的大小-Delphi资料 用Delphi开发分隔线组件 用Delphi设计拨动、跳线开关组件 用Delphi 设 计 拨 动、 跳 线 开 关 组 件 用Delphi实现JPEG格式图像的显示 用Delphi制作动态有声标签 运行时生成控件-Delphi资料 在DBGRID中实现COPY、PASTE功能-Delphi资料 在Delphi程序的About窗口中建立URL连接 会者不难,delphi能不能开发openGL,如果不能,用什么语言开发速度快? atl中如何在设计状态下获取复合控件所包容的控件接口指针? 有没有人看过清华大学出版社出的《Internet 与 Tcp/ip 程序设计之c++ Builder高手》该书如何? 关于回调函数的问题(续) 一个很奇怪的问题,大家帮帮忙. 这是什么病毒啊?——高分求救 简单问题:字符串格式转换问题(判断时间范围) 在编写三层中调用服务端的方法时出现m_Dispath !=0好像是utilcls.h文件有错 我需要一位绝色美女,用Delphi7怎样搞定难,!!! kv3000的A盘是怎么加密的? 丹麦队率先破门1:0,法国就要完了! 请问javascript变量怎么传递给jsp变量? 哪个网战可以有在线直播世界杯?(不是图文的) crystal report 的问题 树状导航菜单的实现 给点学java的建议 看看这个错误。有关ADO 连接sybase 数据库的问题。30分在线等待。 请大侠将char *destination,*source while (*destination++==*source++); 详细分解成容易的循环语句 我装了三个系统windows98,win200,windows xp.后win2000起不来了,提示<windows root>什么文件<winnt/system32/hal.dll>文件损坏,拷一个 怎么样在页面中定位控件的绝对位置。 kv3000的A盘是怎么加密的? 看看印度人开发软件的方式吧.(转贴) 在ADO.NET中如何返回多表联合查询的结果? 如何获得分给本机的所有IP地址? 揭下网上广泛流传所谓真实网友照片的铁幕,,,,,,,,, 如何启动与关闭外部程序. 怎么样删除某一个目录下的文件~~~~~急 请问在WIN2000PRO上安装PcAnyWhere Ver.10后经常死机,会是咩原因造成? 如何在SQLNET中配置配置命名服务器? 我做的鉤子,為什麼不能截獲WM_DESTROY消息 有谁用过java+Dimino开发过项目? vcl的类的析构函数怎么继承? 紧急求助!在线等待! DELPHI怎样通过ADO来对DBASE3的数据库表进行物理删除?高手请进 如何使用C给FOX的DBF库加上索引. Encrypt加密源码 将桌面存为图像文件? DIRECTX3D问题 如何统计字符串中的字符数量! 怎样知道自己电脑的声卡是什么型号?并安装相应的驱动程序? 跳转窗口的时候如何消除工具栏 使用cuteftp时出的错! 怎么能添加一个链接 寻求使用rtp/rtcp的实时视频传输例子!! 输入法与文字处理程序间的关系是怎样? 如何使数据窗口的全部数据默认选定!? 请问,Delphi中有类似VC的静态变量吗? 想要一个用jsp做的新闻发布系统 请问ORACLE的凭证检索失败是怎么回事?--谢谢 char *mdd=5 内存中进行了什么动作?可否解释一下 我想问多下,那wininet.dll 文件是不是nt的系统都有噶? 土壤温度过低为什么对植物吸水有影响? 关于生物遗传学,比如,祖父与祖母是Bb,生了2个女儿,其中一个是Bb,另一个不确定.Bb嫁给了Bb,不确定的那个嫁给了BB,他们生的男的和女的(表现是正常的),如果结婚,“后代男性患病的几率是 ” 光到底是波还是粒子 人造地球卫星绕地球做匀速圆周运动,其轨道半径为R,线速度为v,周期为T,若要使卫星的周期变 为2T,可能人造地球卫星绕地球做匀速圆周运动,其轨道半径为R,线速度为v,周期为T,若要使卫星的周 浓硫酸和稀硫酸敞口放置,请问究竟是浓硫酸吸水变成稀硫酸还是稀硫酸中水分蒸发变成浓硫酸? 1.请从下列实例中指出哪对是等位基因( )A.某人有耳垂,单眼皮,其控制耳垂和眼皮的基因B.豌豆高茎,花位顶生,其控制茎高和花位的基因C.杂合子黄粒玉米体细胞中控制玉米粒色的基因D.控制杂 人造地球卫星绕地球做匀速圆周运动,其轨道半径为r,线速度为v,周期为T,若要使卫星的周期变为2T,下列办法中可能的是A.r不变,v2B.v不变,使轨道半径增为2rC.使轨道半径变为 34rD使卫星的高 浓硫酸露置于空气中,水蒸发,有吸水,它溶质质量分数会变吗? 要是2mol 甲烷完全与氯气发生取代,生成4种氯代产物,且生成的氯代产物物质的量相同,则需氯气的物质的量?生成氯化氢,物质的量? 人造卫星绕地球做匀速圆周运动,其轨道半径为R,线速度为V,周期为T.若是卫星的周期变为2T,可采取的方法 我想问的是:浓硫酸吸水是物理变化还是化学变化?其实以前总是认为是物理变化了,脱水是化学变化的 .但是最近看了些辅导书,有的说吸水也是化学变化请指教! 以“云”为描写对象,运用比喻和拟人手法写一段话两三行就可以 人造卫星绕地球做匀速圆周运动,其轨道半径为R,线速度为v,周期为T,若要使卫星的周期变为2T,可能的办法A.R不变,使线速度变为v/2 B.v不变,使轨道半径变为2RC.轨道半径变为 (3倍根号4)R D.栏角 发动机废气怎么产生的?去那里了?废气大了是什么原因?影响什么?气门室盖上的气体从那里产生?从那些地方经过来气门室盖的?由活塞环的开口来,经过机体内部空间到气门室盖 然后去那里咯? 用比喻和拟人手法写一段话 并写出好处是什么各写一段话 质量为m的人造地球卫星绕地球做匀速圆周运动,其轨道半径为r,线速度为v,加速度为a,周期为T,动能为Ek,下列关系正确的是:A .Ek∝1/r B .a∝1/r C .T³∝r² D.v∝1/r 要有详细的解析,理由. 废气再循环与发动机爆燃有什么关系吗? 写一段话,用上比喻和拟人 原核生物与真核生物的遗传都符合孟德尔遗传规律吗 传统的电喷发动机废气再循环装置有何结构特点 光粒子 为什么不既是波又是粒子呢 杭州25号今天下大雨吗 天气预报说了但又不确定因为我们看天气上班的我去不去呢 一会儿太阳一会儿下雨的 什么是废气循环 解释孟德尔的分离定律 生物遗传学的概率计算 紧急!忘了怎么算了~某岛上换白化病(常隐)的人口占9%,问携带者占百分之几. 化学元素周期表应该按什么顺序背?还有,相对原子质量又是什么意思? 雌蜂和雄蜂交配 产生F1代,在F1代雌雄个体 交配产生夺得 F2中,雄蜂基因型有AB、Ab、aB、ab四种,雌蜂的基因型共有AaBb、Aabb、aaBb、aabb四种,则亲本的基因型是( )A.aabb×AB B.AaBb×Ab C.AAbb×aB D.AABB×ab ( )是北极地区土著人,旧称“爱斯基摩人”.他们住在雪屋里.( )是他们的传统的生活方式. 埃及开罗距离亚历山大港多远? 孟德尔分离定律 DNA的概念及在遗传学中的左右是什么 埃及亚历山大港经纬度是多少? 孟德尔分离定律问题如果在一个种群中,基因型AA比例占25%,基因型Aa比例为50%,基因型aa的比例占25%.已知基因型aa的个体失去求偶和繁殖的能力,自交一代后,基因型为aa的个体所占的比例为?为什 一个遗传学概念的问题我在遗传学书上看到这样一句话:“在二倍体的细胞或各题内有两个同源染色体,所以每一个座位上有两个等位基因”是什么意思哩?我是高中生,我们只学了同源染色体 人屁的主要成分是什么?人屁中是否含有可燃气体? 生态农业涉及农家废料的综合利用,某种肥料经 发酵得到一种含甲烷、二氧化碳、氮生态农业涉及农家废料的综合利用,某种肥料经 发酵得到一种含甲烷、二氧化碳、氮气的混合气 体.2.016 L( 说,孟德尔的遗传规律不适用于原核生物,这是因为原核生物主要进行无性生殖,但是说他没细胞核为什么不对? 屁的主要成分是什么?是二氧化碳吗 生态农业涉及农家废料的综合利用,某种肥料经发酵得到一种含甲烷、二氧化碳、氮气的混合气体.2.016L(标准状况)该气体通过盛有红热CuO粉末的硬质玻璃管,发生的反应为:CH4+4CuOCO2+2H2O+4Cu. 孟德尔遗传规律不适合原核生物的原因是孟德尔遗传规律不适合原核生物是因为无性生殖还是没有完整的细胞器 如何根据粉尘的特性进行除尘 生态农业涉及农家废料的综合利用,某种肥料经发酵得到一种含甲烷、二氧化碳、氮气的混合气体.高一化学生态农业涉及农家废料的综合利用,某种肥料经发酵得到一种含甲烷、二氧化碳、氮 什么是超光粉尘 屁是怎么形成的?主要成分是什么? 用拟人的手法写一句话,描写大雨时的情景. 废气 超标 怎么办 湿式电除尘对金属粉尘的效率?电路板焚烧高炉(国外)废气中含有大量金属粉尘,现用布袋除尘,但因油性物质及带水问题,处理成本极高.请问这类废气能使用电除尘处理吗?湿式电除尘呢?求解 屁的成分是什么? 求南京明天准确天气预报,下雨是什么阶段 屁的主要成分有哪些? 描写下雨时的情景夏天 什么原因造成土壤不吸水? 袋式除尘器除尘过程中粉尘性质对滤袋有什么影响? 下雨的环境描写是开头和结尾要长一点100子左右(开头结尾各100)给个30分答得好加分谁给一个100字左右的结尾我多加20分要赶快 土壤几乎不吸水是什么原因?就是水不会渗进土壤中,在上面滚啊滚的,最后从盆壁的缝隙漏掉了.是新土,很蓬松。 屁的主要成分是什么?为什么会臭呢 下雨场景描写排比也可以是暴雨不是细雨 土壤吸水最好的是壤土吗今天就得回答 物体浸没在水中时,弹簧测力计的示数是它受到的重力的1/3,则这个物体的密度为 描写下雨时校园的情景
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘