用C#来捕获屏幕_第1页
用C#来捕获屏幕_第2页
用C#来捕获屏幕_第3页
用C#来捕获屏幕_第4页
用C#来捕获屏幕_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用c#来捕获屏幕其实用c可以完成其他程序设计语言的几乎全部功能,当然c自身的许多独到的功能,是其他程序语言所无法实现的,这就是c越来越受到广大程序员的喜欢的原因。本文就来探讨一下用c去实现一个重要的功能,用他来编写一个捕获当前屏幕地程序。通过这个程序,我们将了解到c是如何调用api函数,和.net框架中的类库内容是多么地丰富,功能是多么地强大。 一 程序设计开发及运行环境: (1).微软视窗2000服务器版 (2).net framework sdk beta 2 二 程序设计的关键步骤: 要想完成这个功能,首先要了解一下在c中如何调用api(应用程序接口)函数。虽然在.net框架中已经提供了

2、许多类库,这些类库的功能也十分强大,但对于一些windows底层编程来说,还是要通过调用这些api函数才可以实现。所有api都在kernel、user 和gdi三个库中得以运行:其中kernel,他的库名为 kernel32.dll, 他主要用于产生与操作系统之间的关联,譬如:程序加载,上下文选择,文件输入输出,内存管理等等。user 这个类库在win32中名叫 user32.dll。 它允许管理全部的用户接口。譬如:窗口 、菜单 、对话框 、图标等等。gdi(图象设备接口),它在win32中的库名为:gdi32.dll,它是图形输出库。使用gdi windows画出窗口、菜单以及对话框等;它

3、能创建图形输出;它也能保存图形文件。由于本文所涉及到是图象问题,所有调用的类库是gdi32.dll。在本文程序中我们使用的api函数是bitblt,这个函数对于广大程序员来说,一定不感觉到陌生,因为在图象处理方面他的用途是相对广的,在用其他程序语言编程中,时常也要和他打交道。在.net framework sdk中有一个名字空间system.runtime.interopservices,此名字空间提供了一系列的类来访问com对象,和调用本地的api函数。下面是在c中声明此函数: system.runtime.interopservices.dllimportattribute ( gdi32

4、.dll ) private static extern bool bitblt (intptr hdcdest , / 目标 dc的句柄int nxdest , int nydest , int nwidth , int nheight , intptr hdcsrc ,/ 源dc的句柄int nxsrc , int nysrc , system.int32 dwrop/ 光栅的处理数值) ;通过上面这个声明,就可以在下面的代码中使用此函数了。 下面是用c做屏幕捕获程序的具体实现步骤: (1).首先要获得当前屏幕的graphic对象,通过以下代码可以实现: graphics g1 = thi

5、s.creategraphics ( ) ;(2).创建一个bitmap对象,并且这个bitmap对象的大小是当前屏幕: 首先要获得当前屏幕的大小,通过名字空间system.windows.forms中的screen类的getworkingarea()方法,可以实现。下面是得到当前屏幕的长(height)和宽(width): rectangle rect = new rectangle ( ) ;rect = screen.getworkingarea ( this ) ;屏幕宽 rect.width ;屏幕长 rect.height ;至此就可以得到我们想要的bitmap了,通过下列语句可以

6、实现: image myimage = new bitmap ( rect.width , rect.height , g1 ) ; /创建以屏幕大小为标准的位图(3).获得当前屏幕和此bitmap对象的dc,这可以通过下列语句实现: /得到屏幕的dcintptr dc1 = g1.gethdc ( ) ;/得到bitmap的dc intptr dc2 = g2.gethdc ( ) ;(4).调用api函数,把当前屏幕拷贝到创建的bitmap中: bitblt ( dc2 , 0 , 0 , rect.width , rect.height , dc1 , 0 , 0 , 13369376

7、) ;(5).释放当前屏幕和此bitmap对象的dc,通过下面代码可以实现: /释放掉屏幕的dcg1.releasehdc ( dc1 ) ;/释放掉bitmap的dcg2.releasehdc ( dc2 ) ; (6).保存bitmap对象,形成jpg图片: myimage.save ( c:capture.jpg , imageformat.jpeg );当然你也可以根据自己的需要,把屏幕以其他图片的格式来保存,如果你想把图片保存为位图文件,可以把imageformat.jpeg改换成imageformat.bmp;想把图片保存为gif文件,就把imageformat.jpeg改换成im

8、ageformat.gif。你可以保存的文件类型大概有十多种,这里就不一一介绍了,当然你也要相应改变保存文件的后缀。 三 用c来捕获屏幕的源程序代码(capture.cs): 了解上面的这些步骤的实现方法,就可以得到用c捕获屏幕的源程序,如下: using system ;using system.drawing ;using system.collections ;using system.componentmodel ;using system.windows.forms ;using system.data ;using system.drawing.imaging ;public cl

9、ass form1 : formprivate button button1 ;private system.componentmodel.container components = null ;public form1 ( )/初始化窗体中的各个组件initializecomponent ( ) ;/ 清除程序中使用过的资源protected override void dispose ( bool disposing )if ( disposing )if ( components != null ) components.dispose ( ) ;base.dispose ( disp

10、osing ) ;private void initializecomponent ( )button1 = new button ( );suspendlayout ( ) ;button1.location = new system.drawing.point ( 64 , 40 ) ;button1.name = button1 ;button1.size = new system.drawing.size ( 80 , 32 ) ;button1.tabindex = 0 ;button1.text = 捕获 ;button1.click += new system.eventhand

11、ler ( button1_click ) ;autoscalebasesize = new system.drawing.size ( 6 , 14 ) ;clientsize = new system.drawing.size ( 216 , 125 ) ;controls.add( button1 ) ;maximizebox = false ;minimizebox = false ;name = form1 ;text = c#捕获当前屏幕! ;resumelayout ( false ) ;/声明一个api函数 system.runtime.interopservices.dlli

12、mportattribute ( gdi32.dll ) private static extern bool bitblt (intptr hdcdest , / 目标 dc的句柄int nxdest , int nydest , int nwidth , int nheight , intptr hdcsrc ,/ 源dc的句柄int nxsrc , int nysrc , system.int32 dwrop/ 光栅的处理数值) ;static void main ( ) application.run ( new form1 ( ) ) ;private void button1_cl

13、ick ( object sender , system.eventargs e )/获得当前屏幕的大小rectangle rect = new rectangle ( ) ;rect = screen.getworkingarea ( this ) ;/创建一个以当前屏幕为模板的图象graphics g1 = this.creategraphics ( ) ;/创建以屏幕大小为标准的位图 image myimage = new bitmap ( rect.width , rect.height , g1 ) ;graphics g2 = graphics.fromimage ( myimage ) ;/得到屏幕的dcintptr dc1 = g1.gethdc ( ) ;/得到bitmap的dc intptr dc2 = g2.gethdc ( ) ;/调用此api函数,实现屏幕捕获bitblt ( dc2 , 0 , 0 , rect.width , rect.he

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论