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

利用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姚宏宇:与行业结合是私有云厂商的重要出路 万亿移动支付产业的难点和痛点 削减硬件运营成本?亚马逊或自主研发ARM架构芯片 开源框架eMobc:XML开发原生移动应用so easy iOS应用安全开发,你不知道的那些事 市场化API的十个捷径 MongoDB和Cloudera结盟,欲征服大数据市场 红帽收购Inktank,将统一Gluster与Ceph? 那些巨头公司Logo是这么演变来的…… 以史为镜,剖析PaaS大迷局 “心脏出血”还不够?又曝OAuth和OpenID登录漏洞 走近讲师:搜狐于顺治讲述搜狐PaaS云平台实践之路 AppFlood 2014 Q1报告:亚洲和中东市场成为开发者出海首选 华为联合运营商构建能力开放平台 Facebook产品设计主管:揭秘公司如何招聘优秀设计师 【附信息图】美国因软件缺陷导致的十大事件 二十一世纪Windows简史 为什么用户体验和生态系统决定云公司的成败 三星Tizen,路漫漫其修远兮 用户体验是新优势,互联网会受到何种影响? 从GitHub看编程语言流行度 陈沙克:Openstack Horizon Icehouse Blueprint简介 叶琪:Hadoop不是万能的 要明确场景扬长避短 云网融合驱动数据中心技术聚变 给想持续编码CEO的4个建议 盘点开发者最喜爱的十大开源Xcode插件 Cloudera CTO:取代MapReduce 未来会加大Spark等框架投入 中航信资深分析师李洋:自主搭建云平台 助力民航业低成本迎接大数据挑战 安全狗创始人陈奋:借助Hadoop与Spark,欲打造服务器上的360 业界良心:Square开源Viewfinder,25万行代码全公布! 比尔&#183;盖茨:核心业务Bing虽不赚钱,却不能拆分 两个异地的windows2000 server服务器,如何配置在一个组织下! 用ADO做SQL的操作出现的奇怪问题 帮忙解释一下scjp中的这道线程题…… 我的这段程序为什么不能出现图标呢?(有关树控件)急等! 请问哪里有maple下载 给100分 怎样才能更好的通过网络学习,不断的提高自己,大家各抒己见! google被封,上有政策,下有对策,想继续使用google的进来!!! 有kjava相关的资料或信息者请入 使用session问题 各位大侠,怎样在VB6中通过代码,控制SQLServer6中数据表的权限,如只读,可写,能删等。 谁知道哪有SCJP的英文原版教材下载呀? 为什么对话框的类都看不到析构函数! 请教一个SQL的问题 从局域网内拷贝文件,总是断线 问大家一个特别傻的问题,但是请务必帮我解答,谢谢了 问大家一个特别傻的问题,但是请务必帮我解答,谢谢了 treeView控件的问题 asp中的几个问题,急! 在类中用static const 定义常量的问题 谁安装oracle9i了? 哪里有文档编辑软件的源程序(带查找、替换),给url就给分? =最近做了一个免费小工具,想请大家帮忙测试并发表一些关于我的程序功能和界面布局的意见= 很急 [建议]关于提问 100分请教如何使用JS来实现定时执行alert()命令 请问怎样给DataGrid添加一个空行? 请问在用openssl生成csr时出现如下的问题,如何解决?急用 100感谢 =最近做了一个免费小工具,想请大家帮忙测试并发表一些关于我的程序功能和界面布局的意见= oracle 9i的问题,急救 24位的位图是不是没有颜色表? 一个简单的关于层的问题,谁能帮我解释一下呢? 请问在用openssl生成csr时出现如下的问题,如何解决?急用 100感谢 超菜问题? 现在网上有没有破解的MDaemon下载? 唉,和老妈吵架~散分~~ LyfUpload组件上传时能否添加下拉框,并把其值一起提交到数据库中?急!急!急! 请高手一览:为什么这段程序不能写进数据库?不好意思,分只有这么多了!呵呵 建立一个收费的网站的思路如何?请大家指教! 怎样改造Anythere 5.0的数据库? 有没有去过珠海的朋友? 我出100分重新讨论《100分求助:如何解决内存泄漏,代码如下》 有没有现成的软件,判断一个email的使用方的具体位置,到“市”一级? 用ADO能不能用SQL语句将Access2000库中的表复制到SQL2000server库中? maddam、Hankuu请进,重新给分。100分求助:如何解决内存泄漏,代码如下(无内容) javascript中如何控制<input type="image" id=id1 name=name1>的位置 如何用pb完成文件上传服务器的功能 有关ORACLE在ODBC内部的连接问题?? 经典砍价术 十个系男生的初夜 菜鸟没分了,还是慷慨散100分求助!(Up 有分) 求救,图像和文本一起上传 二氧化硅的结构和性质 环己烷 椅式 顺式反式的问题.顺式的时候,发生取代,取代两个基团,分别是,甲基和乙基.怎么取代才使产物最稳定?两个都是e,还是一个a一个e. 修改病句:他从早晨到中午写了一天作业 求考察二氧化硅性质的化学题不要太简单的,说明考察的知识点以及正确答案 蛋白质合成所需模板在细胞核内形成 对不对 一般LED灯的环氧树脂胶需要多久才会固化? SiO2+Na2CO3的方程式表示二氧化硅的什么性质 设E为平面上以A(4,1),B(-1,-6),C(-3,-2)为顶点的三角形区域(包括边界),则z=4x-3y的最大值与最小值分别为A14,-18 B-14,-18 C18,14 D18,-14我错了,C(-3,2) 消除环境污染我们应该怎么办 确定正交平面参考系必须提出哪些假设?为什么? 物质通过核孔进入细胞核中时需要载体与能量吗? 现时期存在的环境污染, 十三.阅读短文,有一棵大树,它自命不凡、十三.阅读短文,14分 有一棵大树,它自命不凡,常常吹 嘘自己的本领.一天,它对大地说:“谁也没有我本领大.夏天的太阳多热呀,像个大火球,可我能用我 亲核蛋白进入细胞核由什么决定?需不需要消耗能量? 消除环境污染我们该做什么 一棵大树文章答案从前有一棵树,她很爱一个男孩.每天,男孩都会到树下来,把树的落叶拾起来,做成一个树冠,装成森林之王.有时候,他爬上树去,抓住树枝荡秋千,或者吃树上结的果子.有时,他们 氨基酸能进入到细胞核中去吗,细胞核又不利用它啊?蛋白质通过核孔时,需要载体和能量吗? 我国属于多地震国家吗? 二氧化硅是人类将太阳能转化为电能的常用材料对吗? 是谁绕着地球转了一圈 我国是多地震国家,原因是什么? 如何区分顺反异构,以环己烷及其衍生物为例 通俗易懂点哟.别百度上复制+粘贴. 我想知地球转动一圈,每秒转多远 经常发生地震的国家有哪些 红外光谱是如何区分顺反异构,和取代基类型? 转地球一圈需要多少光年 镇江恒顺股份有限公司与镇江恒顺集团有限公司是同一个公司吗 刀具的正交平面、基面、切削平面定义是什么? 什么是生物的呼吸? 胃酸为什么不会腐蚀胃本身 谁能详细的解释一下转录翻译什么的.细胞核什么的. 顺反异构的取代基一定相同吗 修改病句并说明原因 我还把今天的作业没作完 细胞核的什么结构使基因在转录和翻译两个过程在时空上分开 、在正交平面中测量的角度有()、()、(),在基面中测量的角度有()、()、() . 生物都能呼吸例如 地球内部可以分成那三部分? 刀具正交平面坐标系的三个组成平面是什么 生物为何要呼吸?是否是单纯地为了支持呼吸作用的进行? 假如地球的体积和质量均少1/2,那么与现在相比,地球的环境可能会发生哪些变化 数控刀具中正交平面参考系基面有个不明白的地方1:普通车床和数控车床M03主运动的方向分别是哪个方向?它们不是旋转的吗,怎么分辨主运动哪个方向? 冬天喝蜂蜜水好吗 全球的气温升高,主要是因为排放到空中的( )等温室气体增加造成的 基面,切削平面和正交平面有什么关系 我大约花了25分钟左右做完了数学作业.修改病句 车刀的角度符号是什么字母如何打出来 岩石和矿物被开采后为什么不能再生? 我大约花了25分钟完成这项工作.(修改病句)如何改? 做好了一个平面标志,想用3D做个立体标志做效果,哪里有这类的教程啊 岩石和矿物是怎样开采出来的? 用看过的爱国影片或人物传记,写一篇读后感或观后感.(真实感受)快!500字左右 一分钟过去了,地球上大约有增加了300个婴儿.全球平均每秒大约有多少个婴儿出生?要数量关系 要数量关系 人类不停的开采岩石和矿物,我们的生活将会产生什么样的影响? 最新英语电影观后感!要有:电影名字,主角,感受,主要内容.希望带中文,不带也可以.一共要2篇而已!这是寒假作业啊~所以很急啊!能在两天内交货的,加50分吧~ 一分钟过去了地球上大约又增加了300个婴儿全球平均每秒大约有多少噶婴儿出生.方程等量关系 岩石和矿物被开采后,就不能( ),因此我们要很好地( )、( )地利用岩石和矿物. 一片观后感 观‘伦敦奥运有’有感 二氧化硅有哪些物理性质 歼十出击观后感600 为了增加橡胶产量,切口位置应靠近橡胶树-------部(顶、中、基)选择
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘