基于Delphi的屏幕抓图技术的实现

开发 开发工具
本文以Delphi7.0作为开发平台,给出了网络监控软件中的两种屏幕抓图技术的设计方法和步骤。介绍了教师在计算机机房内教学时,如何监控学生计算机显示器上的画面,以保证教学的质量和效果。

  随着网络技术的飞速发展,计算机网络在各高等院校教学中的使用已非常普遍,但是,我们发现一个问题,在教学的过程中,由于老师是面对着学生,而背对着学生计算机的显示器,不能随时查看学生计算机显示器上的内容,所以,有的学生在教学中偷玩游戏,影响了教学的质量和效果,因此,设计一款网络监控软件,监控学生计算机,十分必要。本文以Delphi7.0作为开发平台,给出了网络监控软件中的两种屏幕抓图技术的设计方法和步骤。为了实现这一目的,此系统应具有以下功能:

  (1)教师用机可以循环显示学生计算机的显示器上的画面。

  (2)教师用机可以动态显示某一学生计算机的显示器上的画面。

  (3)教师用机可以对学生用计算机发出警告信息和控制信息。

  (4)学生用计算机开机自动运行服务端监控程序。

  (5)为了防止学生用计算机的服务端监控程序,被学生发现用Ctrl+Alt+Del关闭,在Ctrl+Alt+Del对话框中必须隐藏程序。同时,应该隐藏程序在任务栏的按钮。

  本文结合应用实践,重点向大家介绍在Delphi7.0中可以采用的两种实现屏幕抓图技术的操作方法。

  程序实现

  (1)抓取屏幕图像的难点有两个:一是如何夺取屏幕的句柄,二是知道屏幕句柄后如何获取屏幕的图像。Borland公司的设计人员用画布(Tcanvas)对象封装了Windows的大部分图形输出功能,可以通过它以更直观的方式和Windows的屏幕打交道,而不必关心令人头疼的Windows API函数。具体程序如下:

  1. procedure TForm1.Timer1Timer(Sender:TObject);//抓取屏幕,并保存到Image控件中  
  2. var  
  3.  Fullscreen:Tbitmap;  
  4.  FullscreenCanvas:TCanvas;  
  5.  dc:HDC;  
  6. begin  
  7.  Fullscreen:=TBitmap.Create;   
  8.  //创建一个BITMAP来存放图象  
  9.  Fullscreen.Width:=screen.width;  
  10.  Fullscreen.Height:=screen.Height;  
  11.  DC:=GetDC(0); //取得屏幕的DC,参数0指的是屏幕  
  12.  FullscreenCanvas:=TCanvas.Create;   
  13.  //创建一个CANVAS对象  
  14.  FullscreenCanvas.Handle:=DC;  
  15.  Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),  
  16.  fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));   
  17.  //把整个屏幕复制到BITMAP中  
  18.  FullscreenCanvas.Free;   
  19.  //释放CANVAS对象  
  20.  ReleaseDC(0,DC); //释放DC  
  21.  //*******************************  
  22.  image1.picture.Bitmap:=fullscreen; //拷贝下的图象赋给IMAGE对象  
  23.  image1.Width:=fullscreen.Width;  
  24.  image1.Height:=fullscreen.Height;  
  25.  fullscreen.free; //释放bitmap  
  26.  form1.WindowState:=wsNormal; //复原窗口状态  
  27.  form1.show; //显示窗口  
  28.  messagebeep(1); //BEEP叫一声,报告图象已经截取好了。  
  29. end;  

  (2)Delphi的第三方控件ScreenCapture,它是一个很好的免费的截图控件,可以轻松抓取任意大小(全屏当然行)、屏幕的任何位置,还可以设置所截图像的形状、以及用何种模式截图。下面介绍的是用TcmWindow模式截图,使用非常简单,使用效果可以与著名的抓图软件SnagIt32媲美。

  1. procedure TForm1.BtnStartClick(Sender:TObject);  
  2. begin  
  3.  ScreenCapture1.start; //开始截图  
  4. end;  
  5.  
  6.  //当截取屏幕成功时,此事件发生  
  7.  procedure TForm1.ScreenCapture1Capture(Sender:TObject;Bitmap:TBitmap);  
  8. begin  
  9.  //调整滚动窗口的大小以适应截获图像的大小  
  10.  Scrollbox1.HorzScrollBar.Range:= Image1.width;  
  11.  Scrollbox1.VertScrollBar.Range:= Image1.height;  
  12. end;  
  13.  
  14. procedure TForm1.FormCreate(Sender:TObject);  
  15. begin  
  16.  //载入entntacp.dll文件  
  17.  BtnStart.enabled:= ScreenCapture1.dllavailable;  
  18.  //显示版本信息  
  19.  caption:= '屏幕抓图软件' + ScreenCapture1.version;  
  20. end;  
  21.  
  22. //当没有足够的内存支持截取屏幕时,此事件发生  
  23. procedure TForm1.ScreenCapture1Error(Sender:TObject);  
  24. begin  
  25.  MessageDlg('屏幕截取时发生一个错误!请关闭其他应用程序以获得更多内存资源.', mtError,[mbOK],0);  
  26. end;  
  27.  
  28.  //当用户按“Esc”键,即取消屏幕截取时,此事件发生  
  29. procedure TForm1.ScreenCapture1UserCancelled(Sender:TObject);  
  30. begin  
  31.  MessageDlg('用户取消屏幕截取。',mtInformation,[mbOK],0);  
  32. end;  

  结论

  通过对以上两种程序代码的调试运行,使用第三方控件的方法更易于设计实现,文中的程序代码全部在Win2000和Delphi7.0环境下调试通过。

【编辑推荐】

  1. Delphi基础开发技巧
  2. 在Delphi程序中操作注册表
  3. 在Delphi中使用动态图标
  4. Delphi内存管理的编程技巧
  5. Delphi开发技术手册
责任编辑:韩亚珊 来源: 计算机与信息技术
相关推荐

2009-03-05 09:35:18

LinuxUbuntu截图

2010-08-02 15:21:06

DelphiICMP

2011-08-16 15:48:37

iPhone开发抓图程序

2013-07-02 15:23:08

MySQL MHA故障转移

2016-09-29 15:44:18

开源上网管理

2014-09-16 17:00:02

UDP

2009-07-02 16:56:51

JSP技术

2011-04-06 16:14:40

Delphi

2010-05-10 14:17:46

负载均衡技术

2009-02-04 16:11:45

2011-04-22 09:48:51

SimpleFrame

2009-08-27 15:50:23

屏幕取词

2010-05-28 17:59:55

Linux抓图工具

2010-06-10 09:49:38

UML时序图

2024-10-16 13:47:40

2009-03-02 17:49:21

LinuxUbuntu轻松截图

2022-06-02 12:00:55

ClickHouse大数据字节跳动

2010-09-06 16:48:23

PPPoE协议BAS

2011-05-19 10:39:26

2009-01-30 11:38:31

视频监控IPSAN威视数据
点赞
收藏

51CTO技术栈公众号