C#截屏问题及FORM间传值

本文详细介绍了使用C#实现动态截屏功能的过程,包括如何获取全屏截图、在两个FORM间传递截图信息以及如何解决截图资源无法删除的问题。作者通过调用API函数BitBlt实现截屏,并探讨了FORM间通过新建类过渡和传递FORM地址两种传值方法。
摘要由CSDN通过智能技术生成

最近在程序中做一动态截屏功能的小程序;
在完成过程中,遇到了许多问题,
现将其中重要的过程记录如下:

1,要实现动态截屏的原理
刚开始并不知,以为可以得到桌面的句柄直接调用左右鼠标点击得到.
哪有那么如想像中的美事
看了许多别人的程序.,特别是QQ的动态截屏功能,
他们在截屏的时候桌面都是静态的.
原来此时的背景是一个最大化的FORM,把其标题栏,按钮等都取消了.
像做桌面保护程序那样的风格.
在这个FORM中得到它的两个坐标是很容易的事;
也就是说:先截全屏到一个FORM中显示
在这个FORM中截你所想要的一部分并在第一个FORM中显示所截部分;
这样就出现了要在两个之间传值;
最初为了避免传值(呵呵,当时不会传值),我先把所截部分保存一张图片,
在第一个FORM中检测是晋中有图片存在,有则显示出来
功能是实现了,但有了新问题?只能截一次!
原因是,第二要截屏则要删除保存的图片,为第二次截屏准备,但异常显示
图片资源被调用,无法删除.也是为什么第二次截图不能保存的原因.
mypicturebox.Image=null;这样的操作也不行的.(有谁知道的怎么样消除调用资源的告诉我一下)
看来这个笨方法不工作了.
在网上找到两种FORM间传值的方法.
一]新建类过渡传值.
二]传递第一个FORM的地址.

2具体实现
清楚了实现原理,就不难实现其功能了~*~
我先用第二个方法实现!
(1)先在第一个FORM中用一按钮启动截屏程序
            this.Hide();//隐藏主对话框.
            Thread.Sleep(150);//停止一下
           
            AllBitmap = Getallscreen();//调用动态截屏
           
            CaptureScreen CaptureS = new CaptureScreen(AllBitmap,this);// 传递全屏BITMAP和地址
            CaptureS.ShowDialog();
            this.Show();
其中调用了截全屏的函数Getallscreen()
        private Bitmap Getallscreen()
        {
            //建立屏幕Graphics
            Graphics grpScreen = Graphics.FromHwnd(IntPtr.Zero);
            //根据屏幕大小建立位图
            Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, grpScreen);
            //建立位图相关Graphics
            Graphics grpBitmap = Graphics.FromImage(bitmap);
            //建立屏幕上下文
            IntPtr hdcScreen = grpScreen.GetHdc();
            //建立位图上下文
            IntPtr hdcBitmap = grpBitmap.GetHdc();
            //将屏幕捕获保存在图位中
            BitBlt(hdcBitmap, 0, 0, bitmap.Width, bitmap.Height, hdcScreen, 0, 0, 0x00CC0020);
            //关闭位图句柄
            grpBitmap.ReleaseHdc(hdcBitmap);
            //关闭屏幕句柄
            grpScreen.ReleaseHdc(hdcScreen);
            //释放位图对像
            grpBitmap.Dispose();
            //释放屏幕对像
            grpScreen.Dispose();
            //返回捕获位图
            return bitmap;
        }
在截全屏函数中用到了一个API函数.
则进行如下操作
using System.Runtime.InteropServices;

         [DllImportAttribute("gdi32.dll")]
         public static extern bool BitBlt(
         IntPtr hdcDest,    //目标设备的句柄
         int nXDest,        // 目标对象的左上角的X坐标
         int nYDest,        // 目标对象的左上角的X坐标
         int nWidth,        // 目标对象的矩形的宽度
         int nHeight,       // 目标对象的矩形的长度
         IntPtr hdcSrc,     // 源设备的句柄
         int nXSrc,         // 源对象的左上角的X坐标
         int nYSrc,         // 源对象的左上角的X坐标
         System.Int32 dwRop // 光栅的操作值
         );

(2)到了最重要的地方,要想把第二个FORM中的数据传递过来就得在第一个FORM中的相应的显示处理程序
我用下列函数
        public void SetMyImage(Bitmap mybitmap)//注意是public类型
        {
            this.mypictureBox.Image = mybitmap;//显示
            myimage

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值