您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > C# 如何截取当前程序窗口指定位置的截图?_doc下载
C#如何截取当前程序窗口指定位置的截图?编程思路(API编程):先调用GetForegroundWindow获取当前活动程序窗口句柄,然后调用GetWindowDC获取窗口的设备句柄(或GetDC函数),调用BitBlt位图传输函数将位图拷贝到兼容的设备场景中(拷贝时可以指定位置和大小),最后保存位图文件。=============================以下源代码内容转自CSDN论坛。要想完成这个功能,首先要了解一下在C#中如何调用API(应用程序接口)函数。虽然在.Net框架中已经提供了许多类库,这些类库的功能也十分强大,但对于一些Windows底层编程来说,还是要通过调用这些API函数才可以实现。所有API都在Kernel、User和GDI三个库中得以运行:其中Kernel,他的库名为KERNEL32.DLL,他主要用于产生与操作系统之间的关联,譬如:程序加载,上下文选择,文件输入输出,内存管理等等。User这个类库在Win32中名叫USER32.DLL。它允许管理全部的用户接口。譬如:窗口、菜单、对话框、图标等等。GDI(图象设备接口),它在Win32中的库名为:GDI32.dll,它是图形输出库。使用GDIWindows画出窗口、菜单以及对话框等;它能创建图形输出;它也能保存图形文件。由于本文所涉及到是图象问题,所有调用的类库是GDI32.dll。在本文程序中我们使用的API函数是BitBlt,这个函数对于广大程序员来说,一定不感觉到陌生,因为在图象处理方面他的用途是相对广的,在用其他程序语言编程中,时常也要和他打交道。在.NetFrameWorkSDK中有一个名字空间System.Runtime.InteropServices,此名字空间提供了一系列的类来访问COM对象,和调用本地的API函数。下面是在C#中声明此函数:[System.Runtime.InteropServices.DllImportAttribute(gdi32.dll)]privatestaticexternboolBitBlt(IntPtrhdcDest,//目标DC的句柄intnXDest,intnYDest,intnWidth,intnHeight,IntPtrhdcSrc,//源DC的句柄intnXSrc,intnYSrc,System.Int32dwRop//光栅的处理数值);通过上面这个声明,就可以在下面的代码中使用此函数了。下面是用C#做屏幕捕获程序的具体实现步骤:(1).首先要获得当前屏幕的graphic对象,通过以下代码可以实现:Graphicsg1=this.CreateGraphics();(2).创建一个Bitmap对象,并且这个Bitmap对象的大小是当前屏幕:首先要获得当前屏幕的大小,通过名字空间System.Windows.Forms中的Screen类的GetWorkingArea()方法,可以实现。下面是得到当前屏幕的长(Height)和宽(Width):Rectanglerect=newRectangle();rect=Screen.GetWorkingArea(this);屏幕宽=rect.Width;屏幕长=rect.Height;至此就可以得到我们想要的Bitmap了,通过下列语句可以实现:ImageMyImage=newBitmap(rect.Width,rect.Height,g1);//创建以屏幕大小为标准的位图(3).获得当前屏幕和此Bitmap对象的DC,这可以通过下列语句实现://得到屏幕的DCIntPtrdc1=g1.GetHdc();//得到Bitmap的DCIntPtrdc2=g2.GetHdc();(4).调用API函数,把当前屏幕拷贝到创建的Bitmap中:BitBlt(dc2,0,0,rect.Width,rect.Height,dc1,0,0,13369376);(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改换成ImageFormat.Gif。你可以保存的文件类型大概有十多种,这里就不一一介绍了,当然你也要相应改变保存文件的后缀。用C#来捕获屏幕的源程序代码(Capture.cs):了解上面的这些步骤的实现方法,就可以得到用C#捕获屏幕的源程序,如下:usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Data;usingSystem.Drawing.Imaging;publicclassForm1:Form{privateButtonbutton1;privateSystem.ComponentModel.Containercomponents=null;publicForm1(){//初始化窗体中的各个组件InitializeComponent();}//清除程序中使用过的资源protectedoverridevoidDispose(booldisposing){if(disposing){if(components!=null){components.Dispose();}}base.Dispose(disposing);}privatevoidInitializeComponent(){button1=newButton();SuspendLayout();button1.Location=newSystem.Drawing.Point(64,40);button1.Name=button1;button1.Size=newSystem.Drawing.Size(80,32);button1.TabIndex=0;button1.Text=捕获;button1.Click+=newSystem.EventHandler(button1_Click);AutoScaleBaseSize=newSystem.Drawing.Size(6,14);ClientSize=newSystem.Drawing.Size(216,125);Controls.Add(button1);MaximizeBox=false;MinimizeBox=false;Name=Form1;Text=C#捕获当前屏幕!;ResumeLayout(false);}//声明一个API函数[System.Runtime.InteropServices.DllImportAttribute(gdi32.dll)]privatestaticexternboolBitBlt(IntPtrhdcDest,//目标DC的句柄intnXDest,intnYDest,intnWidth,intnHeight,IntPtrhdcSrc,//源DC的句柄intnXSrc,intnYSrc,System.Int32dwRop//光栅的处理数值);staticvoidMain(){Application.Run(newForm1());}privatevoidbutton1_Click(objectsender,System.EventArgse){//获得当前屏幕的大小Rectanglerect=newRectangle();rect=Screen.GetWorkingArea(this);//创建一个以当前屏幕为模板的图象Graphicsg1=this.CreateGraphics();//创建以屏幕大小为标准的位图ImageMyImage=newBitmap(rect.Width,rect.Height,g1);Graphicsg2=Graphics.FromImage(MyImage);//得到屏幕的DCIntPtrdc1=g1.GetHdc();//得到Bitmap的DCIntPtrdc2=g2.GetHdc();//调用此API函数,实现屏幕捕获BitBlt(dc2,0,0,rect.Width,rect.Height,dc1,0,0,13369376);//释放掉屏幕的DCg1.ReleaseHdc(dc1);//释放掉Bitmap的DCg2.ReleaseHdc(dc2);//以JPG文件格式来保存MyImage.Save(@c:\Capture.jpg,ImageFormat.Jpeg);MessageBox.Show(当前屏幕已经保存为C盘的capture.jpg文件!);}}
本文标题:C# 如何截取当前程序窗口指定位置的截图?_doc下载
链接地址:https://www.777doc.com/doc-7088196 .html