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

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

主流浏览器性能测试,IE10百分百完胜! TortoiseSVN的基本操作 再见,Fireworks! 投资者告诉诺基亚CEO:他们快没耐心了 直接拿来用!最火的Android开源项目(二) xml schema 问题!!??? 结束 BUG,畅通无阻——水晶报表 Service Packs 下载! 如何找出一个目录下的所有*.txt文件??高手请教 结束 BUG,畅通无阻——水晶报表 Service Packs 下载! dos下如何控制串口的RTS,DTR,TXD,RXD為HIGH,LOW呢? 一个这样的问题,不知怎要问,详请请看内容 在水晶报表中怎样实现分栏打印? 如何把一篇Word 文档保存到数据库里? ERP 和 MRP II是什么意思? 甲醇与乙醇的区别是什么他们的化学式的区别 为什么一 在昆山75度酒精去哪里买在昆山城北玉山镇这里附近有 怎样区别甲醇和乙醇 生物醇油在餐厅用起来到底如何?我现在用柴油太费钱, 饭店用燃料油. 煤炭和生物醇油那个省钱,我是开饭店的 关于饭店生物醇油的安全使用最因为有使用不当引起爆炸 佰特20甲醇燃油主要的成分是什么多点 佰特航模甲醇燃油用这样的油又那些优势?佰特甲醇燃油 通讯:历史遗迹记录昔日辉煌――泰国旧英国铜像常被挂内裤乳罩 政府被迫将其英国铜像常被挂内裤乳罩 政府被迫将其通讯:历史遗迹记录昔日辉煌――泰国旧亲善合作 睦邻友好——国内外人士积极全市扶贫开发工作推进会在西华县召开贫困如同暴君:越贫困,越无力周口建材路上新添16路公交车谷歌眼镜停售你捉急么?国青半场被爆,范斌:无人发挥正常全职系统末世之进化论重铸大明点穴神功锥世齐云山旅游甘孜旅游遵义旅游江门旅游吉林旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘