日期:2011-07-09  浏览次数:20475 次

这个文章还是有一些可以借鉴的地方

-------------------------------------------------------------------------

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

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();
            //返回捕获位图