日期:2011-07-09 浏览次数:20495 次
这个文章还是有一些可以借鉴的地方
-------------------------------------------------------------------------
最近在程序中做一动态截屏功能的小程序;
在完成过程中,遇到了许多问题,
现将其中重要的过程记录如下:
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();
//返回捕获位图