当前位置: 首页 > 开发语言 > Delphi > Delphi6教程动态抓取屏幕

Delphi6教程动态抓取屏幕

时间:2020-11-16 18:20来源:未知 点击:
分享到:
本实例将制作一个能够随时抓取屏幕图像的软件。

在窗体中添加TImageList组件、TMainMenu组件、TSavePictureDialg组件、TTollBar组件和TImage组件,TImage组件用来显示一幅图片,TTrackBar组件用于调节窗体的透明度。添加组件后的窗体如图1-12所示。

图1-12  添加组件后的窗体

本程序的核心是CaptureScreen函数,通过它可以完成抓取屏幕图像的操作,代码如下:
procedure TfrmMain.CaptureScreen();
var
    Fullscreen:TBitmap;
    FullscreenCanvas:TCanvas;
    DC:HDC;
begin
    Fullscreen:=TBitmap.Create;
    Fullscreen.Width:=screen.width;
    Fullscreen.Height:=screen.Height;
    DC:=GetDC(0);
    //取得屏幕的DC,参数0指的是屏幕
    FullscreenCanvas:=TCanvas.Create;
    //创建一个CANVAS对象
    FullscreenCanvas.Handle:=DC;
    Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),
              fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));
    //把整个屏幕复制到BITMAP中
    FullscreenCanvas.Free;
    ReleaseDC(0,DC);
    //释放DC
    Image1.Picture.Bitmap:=fullscreen;
    Image1.Width:=fullscreen.Width;
    Image1.Height:=fullscreen.Height;
    fullscreen.free;
end;
抓取屏幕图像的难点有两个:一是如何获取屏幕的句柄,二是知道屏幕句柄后如何获取屏幕的图像。
首先定义一个HDC类型的变量DC,在程序中通过DC:=GetDC(0)语句就可以获取屏幕的句柄。然后创建一个TCanvas 类型的变量FullscreenCanvas,通过设置它的Handle属性为DC就可以把屏幕的图像关联到FullscreenCanvas中。最后通过语句Fullscreen.Canvas. CopyRect( Rect(0, 0, screen.Width, screen.Height), fullscreenCanvas, Rect(0, 0, Screen.Width, Screen.Height))把fullscreenCanvas中存储的屏幕图像提取到TBitmap类型的变量Fullscreen中。存储到Fullscreen中的图像可以很容易地显示在窗体上的TImage组件中。
当然,用户也可以通过选择菜单“文件”|“保存”选项,来存储抓取完成的屏幕图像。

程序代码如下:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, ComCtrls, ToolWin, ImgList, ExtDlgs;
type
  TfrmMain = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    Image1: TImage;
    ImageList1: TImageList;
    mnuSave: TMenuItem;
    N3: TMenuItem;
    mnuExit: TMenuItem;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    mnuCapture: TMenuItem;
    SavePictureDialog1: TSavePictureDialog;
    procedure mnuCaptureClick(Sender: TObject);
    procedure CaptureScreen();
    procedure mnuExitClick(Sender: TObject);
    procedure mnuSaveClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  frmMain: TfrmMain;
implementation
{$R *.dfm}
 
procedure TfrmMain.mnuCaptureClick(Sender: TObject);
begin
    self.WindowState:=wsMinimized;
    //最小化程序窗口
    self.hide;
    //把程序藏起来
    CaptureScreen;
    self.WindowState:=wsNormal;
    //复原窗口状态
    self.show;
    //显示窗口
end;
 
procedure TfrmMain.CaptureScreen();
var
    Fullscreen:Tbitmap;
    FullscreenCanvas:TCanvas;
    dc:HDC;
begin
    Fullscreen:=TBitmap.Create;
    //创建一个BITMAP来存放图像
    Fullscreen.Width:=screen.width;
    Fullscreen.Height:=screen.Height;
    DC:=GetDC(0);
    //取得屏幕的DC,参数0指的是屏幕
    FullscreenCanvas:=TCanvas.Create;
    //创建一个CANVAS对象
    FullscreenCanvas.Handle:=DC;
 
    Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),
              fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));
    //把整个屏幕复制到BITMAP中
    FullscreenCanvas.Free;
    //释放CANVAS对象
    ReleaseDC(0,DC);
    //释放DC
 
    Image1.Picture.Bitmap:=fullscreen;
    //拷贝下来的图像赋给IMAGE对象
    Image1.Width:=fullscreen.Width;
    Image1.Height:=fullscreen.Height;
    fullscreen.free;
    //释放bitmap
end;
 
procedure TfrmMain.mnuExitClick(Sender: TObject);
begin
    Application.Terminate;
end;
 
procedure TfrmMain.mnuSaveClick(Sender: TObject);
begin
    if self.SavePictureDialog1.Execute then
        self.Image1.Picture.SaveToFile(self.SavePictureDialog1.FileName);
end;
end.

保存文件,然后按F9键运行程序,程序运行的初始画面如图1-13所示。
选择菜单“文件”中的“抓取屏幕”项,程序首先会隐藏自己。抓取屏幕完成后程序会自动恢复正常显示,并且显示抓取完成的屏幕图像,如图1-14所示。

通过这个实例,读者可以学习到如何通过程序抓取屏幕图像。读者可以进一步思考,如何制作可以抓取任何窗口的抓图软件。
 
图1-13  程序运行的初始画面                       图1-14  程序运行结果
(责任编辑:admin)
推荐教程
关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们--网站地图          黑ICP备17004983号-1