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

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

IM助你打造千万级App——容联•云通讯线下沙龙 乐视智能硬件再发力,超级自行车今发布 专访格灵深瞳CTO赵勇:为&quot; 计算机视觉&quot; 赋予智慧的光芒 【程序员电子刊精选】水火不容?研发人员也是产品经理! 如何打动用户?携程用户体验实践分享 【征文】Java二十周年特别策划——谈谈我与Java的那些年、这些事 Facebook的愿景以及虚拟现实的未来 iBeacons一年回顾 英特尔中国30周年之际 IDF上你需要了解的5件事 OpenCloud 2015参会者的三大特征(附列表) 友盟移动互联网趋势报告解读:垂直领域应用竞争白热化 墨腾动漫CTO吴建学:初创公司的生存之道 亿航与高德达成战略合作 LBS+引爆智能硬件软实力 《近匠》火柴手写码,输不错的验证码利器 Web、App中添加动效设计应遵循的12条原则 越狱与开源:2015移动安全峰会(MSS)纪实 开发者自白:我是如何不花一分钱收获230万应用下载量的! OpenCloud 2015报名超预期 近20位讲师会前采访提前看 硅谷公司人才招聘那些事儿——硅谷“超级面试官”董飞专访 一切为了用户体验:揭秘京东首页改版背后的故事 TIOBE 2015年4月编程语言排行榜:Java王者归来 三大主题技术峰会开幕在即 OpenCloud 2015参会者提醒 《近匠》快码,唯快不破的代码众包平台 打破边界 生态化反!乐视发布三款超级手机 苹果收购LinX:iPhone或将采用双摄像头技术 Google《Android性能优化》学习笔记 Amaze UI 2.3.0版本发布 整合多个第三方插件 专访Layabox创始人谢成鸿:Flash与HTML5结合的背后 高德推“LBS+”开放平台战略 整合位置大数据和云计算 CLion 1.0发布,C/C++跨平台集成开发环境 2015超实用的前端开发指南 peihexian的程序发短信的一文中,程序所发的数据包 请问web service到底是个什么东西?谢谢 callingda(林丁) 来拿分30 哪位能提供一个图书管理的VB源码给我参考? yzqb()发工资了47分 请教一个问题,编译不通过,不知是什么错误。 帮帮忙!神经网络 vb 中打印机如何检测? 假如用户正在使用别的软件,如何自动使我的程序获得焦点 批量转移数据 SQL 斑竹呀急,快帮帮我! 想用ADO连接internet上服务器中的database,怎么动态建立间接网上数据库的DSN? 我的Web站点为什么没有安全性? 请问那些捌角人小图片如何做呀? 我也要一份《全套国标软件设计文档》 好人们,谁也发给我一个吧! 如何得到对话框在桌面的位置 紧急求救!编译时的错误! 改变Edit控件后出现字符重叠显现如何解决? 关于DBASE,CLIPPER,FOXPRO,VFP的历史发展 请问那些捌角图片如何做呀? 谁会刻光盘!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! lazywolf(二代) 有没有提供几何图形模板的类(如正方形和圆形)? typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);是定义函数指针吗?为什么这样定义呢? 如何创建vector数组!我这些不对static Vector report[8]=new Vector()[8];高手指点me:) 如何画一个透明的Rectangle VC中修改字体的问题 比你更急!ASP。NET中打开文件问题? HTTP POST QUESTION????? delphi中的pop3控件怎么取得带附件的邮件的正文呀? J2EE随带文档的中文版本哪里有下载??? chr 函数问题 弟兄们,我明天开始要回来了,回到这个阵线了 如何退出双重循环 帮兄弟一把,一个小问题! ADO的连接 高分求解,如何取得默认打印机支持的纸张类型? 用deamweaver ultradev 做的asp怎么修改可以与数据库连接?? 时间问题 ADO连接问题 如何设置串口的流量设置,?设置为无. 请问怎么给JTabPane上各个JPanel(如:JPanel1,JPanel2)使用setMnemonic() 找不到确切哪一天的记录? 各位高手,为什么我在用NMUDP发送数据时当接收端程序没有启动的时候总是提示Stream Write Error,是什么原因,怎么才能让这个错误提示不出现 《机械原理》课有感 大哥 怎么在网上查到这的硬盘是不是水货好像输一个序列号就可以是不是 有谁能提供计算机及应用专业的本科毕业论文,最好是数据库方面的? 注册crystal report 都需要哪些.dll呢 如何能够同时DownLoad多个文件,就像OutLook的文件添附功能? 从sql serevre 6.5 升级到 sql server 2000后 原先的中文字段为何是乱码?急! 怎样用select下拉菜单的双击事件实现页面的提交?? 将20克溶质质量分数为10%的氢氧化钠溶液质量分数增至20%,需蒸发水多少克? 下列现象中,物体的运动状态没有改变的是( )A.守门员把射来的足球抱住B.从飞机上投下的救灾物资C.物体在平直斜面上匀速下滑D.汽车在弯路上匀速转弯 铜合金的密度是多少啊? 5%的氢氧化钠蒸发108克水后,变成30ml20%的氢氧化钠溶液原溶液的质量多少克 实验室同学们要配置一定溶质质量分数的氯化钙溶液实验室里同学们要配制一定溶质质量分数的氯化钙溶液.药品柜中可供选择的药品只有氢氧化钙、氧化钙、碳酸钙和硝酸钙四种固体及一定 求铜合金的密度 水质ph值的标准指数如何计算 水垢对身体有危害吗 硬水和软水的区别. 我们喝的水是硬水还是软水?是硬水对人体好还是软水好? 将质量分数为百分之五的氢氧化钠溶液加热,蒸发掉108克水后变成溶质质量分数为百分之二十的氢氧化钠溶液30毫升.(1)原氢氧化钠溶液的质量是( )克.(2)原氢氧化钠溶液中的水的质量 氢氧化钙溶液与氯化钙溶液为什么会生产氢氧化钙 喝硬水里的氧气对人体有什么作用? 盐水选种需要密度为1.1×10³/m³的盐水,现配制1000cm³的盐水,称得它的质量为1.05kg,已知盐的密度为2.1×10³kg/m³,这样的盐水要盐还是水? 硬水易生水垢,用蒸馏的方法能使硬水软化这句话对吗? 把5g食盐溶解在120g水中,所得溶液中溶质的质量分数是多少? 为何煮沸水可以降低水的硬度?解释谢谢 矿泉水是硬水吗?如怡宝那些.在知道搜索看到许多不同的答案,请给一个合理的答案和令人信服理由. 硬水长期饮用为何对身体不好? 为什么蒸馏和煮沸可以降低水的硬度呢? 矿泉水 硬水为什么是软水呢```矿泉水里面不是也有钙和镁吗 2.把5g食盐溶解在120g水中,所得溶液中溶质的质量分数是多少?急!帮帮忙! 通过煮沸降低水的硬度属于化学变化吗? 用含钙、镁离子较多的硬水洗衣服时,用肥皂更好还是洗衣粉更好哦? 有一金铜合金工艺品,体积为3立方分米,质量为37.1千克.求此工艺品中所含金的质量.(p金=19.3×10³千克/立方米,p铜=8.9×10³千克/立方米) 质量分数为百分之五的氢氧化钠溶液加热 蒸 发掉108克水 变成 质量分数为百分之二十的氢氧化钠溶液30毫升原氢氧化钠溶液的质量是( )克.我知道是百分之五*x=百分之20* (x-108),但溶质的质 矿泉水算是硬水吗? 有一块体积为1.8立方分米的金铜合金,质量为20千克,问:含金百分比. 诉求答案 一杯NaOH溶液蒸发108克水后变为30克质量分数为20%的NaOH溶液,则原溶液质量为____克 向一定量的未知浓度的氯化钙溶液中,加入硝酸银溶液至完全沉淀为止,结果生成的溶液质量与所加入的硝酸银溶液的质量相等,求氯化钙溶液溶质质量分数? 一件标称纯金的工艺品,其质量是100g,体积为6cm立方,他是否由纯金制成?(p金=19.3*1.立方kg/m立方) 静置.吸附.过滤.蒸馏.等操作 中可以降低水硬度的是提上 向一价金属碘化物中加AgNO3溶液,到沉淀完全,生成硝酸盐质量是原碘化物质量,求原硝酸银质量分数向一价金属的碘化物中逐滴滴加硝酸银溶液,直到沉淀完全为止,已知生成的硝酸盐溶液质量等 金铜合金工艺品,体积为3dm3,质量为37.1KG.求所含金的质量?(密度金=19.3X1000千克每立方米)铜=8.9X1000千克每立方米 在一定温度下,某饱和氢氧化钠溶液体积为Vml,溶液密度为d g/cm^3,质量分数为w,物质的量浓度为c mol/L,溶液中含氢氧化钠的质量为m g.(1)用w来表示该温度下氢氧化钠的溶解度(S)为 (2)用m、 某钢瓶内的氧气的密度为6千克/m³,一次气焊用去三分之一,则钢瓶内的氧气密度为( )"4千克/m³"还是"6千克/m³" 硝酸银溶液中加HCI至沉淀完全反映,将沉淀干燥,质量与盐酸质量相等,盐酸质量分数是?请说明解题思路或步骤 怎样用密度为1.19g/cm^3,HCl的质量分数为37%的浓盐酸配置1mol/L的稀盐酸1*1=V*1.19*0.37/37 为了保护环境.治理水土流失,由小东任组长的环保小组测定了长江上游江水中的平均含沙量(即每立方米中含沙的质量).在国家下大力气治理前,他们共采集了40dm^3的水样,称得总质量为40.56kg,已 有NaCl.CaCl2.AlCl3三种溶液,溶质的物质的量相等若分别与足量的硝酸银溶液反应,若生成的沉淀的质量相等有NaCl.CaCl2.AlCl3三种溶液,溶质的物质的量相等若分别与足量的硝酸银溶液反应,则生成沉 用密度为1.18g/cm-3,质量分数为36.5%,浓盐酸配制500ml,0.1mol/L的稀盐酸溶液.则所需量取的浓盐酸体积是? 有40g质量分数为5%的%的氯化钙溶液,若将其溶质的质量分数变为10%,应采用的方法是A.把溶剂蒸发掉一半B.加入40g质量分数为15%的氯化钙溶液C.把溶剂蒸发掉10g .要依据的不要只有答案 硬水的危害? 为什么测湖泊水的硬度时ph要在10时, 10%氯化钙溶液与10%碳酸钠溶液完全反应,生成5g沉淀.蒸发45g水后,得到溶液的质量分数是多少 长期饮用硬水的坏处只知道长期饮用软水对身体不好,会缺乏矿物质;那么长期饮用硬水会有怎样的坏处啊?这样岂不是喝什么水都不行了吗? 将浓度为a%的NAOH溶液蒸发m克,变成2a%的NAOH不饱和溶液Vml.求得NAOH溶液的物质的量浓度 配制一定的溶质质量分数的氯化钙溶液需要哪些器材? 长期饮用硬水对人体有什么危害? 将浓度为A%的NaOH溶液蒸发掉Wg水后,成为VmL的2A%的NaOH溶液,则蒸发后的溶液其物质的量浓度为? 初三物理力学试题 长期饮用硬水会有什么危害? 请问大家谁知道化学题:用密度为D g/cm^3,质量分数为m%浓盐酸,配制...在线等了,谢谢各位9l 初三物理题 力学重10N的铁桶可盛水100N,用这只桶在井中提水,但盛满水的桶还未露出水面时,提桶的力约是A.10N B 90 C 100 D .110谢谢你们喔 我很需要详细说明物理学不好啊,麻烦你们把思路都说 长期喝硬水对身体对什么危害,水该怎么处理来改变水质 用密度为D g/cm^3,质量分数为m%浓盐酸,配制...有谁了解的告诉下哟, 俯卧撑是一项常见的体育健身活动.如图所示是小明同学做俯卧撑的示意图.小明重600N,1min钟内做俯卧撑30个,每做一次肩膀升高50cm.小明身体可视为杠杆,O为支点,A'为重心,0A=1m,B到O点的距离OB=1.5M 判断下列说法是否正确?为什么?在100g水中溶解20g食盐,所得食盐水中溶质的质量分数为20%.( )判断下列说法是否正确?在100g水中溶解20g食盐,所得食盐水中溶质的质量分数为20%.( ) 用密度为D g/cm^3,质量分数为m%浓盐酸,配制...了解的告诉下哟, 如图是搬运工人用滑轮组将仓库中的货物沿水平轨道拉出的示意图.已知货物的质量为600kg,所受轨道的摩擦力为其重力的0.1倍,滑轮组的机械效率为75%.若人以0.5m/s的速度匀速前行,经100s将货物 实验:用过滤法分离粗盐中难溶解杂质,为什么过滤时溶液在滤纸上不下漏
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn