//获得当前屏幕的大小 
                    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);
                    //得到屏幕的DC 
                    IntPtr dc1 = g1.GetHdc();
                    //得到Bitmap的DC 
                    IntPtr dc2 = g2.GetHdc();
                    //调用此API函数,实现屏幕捕获 
                    BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, 0, 0, 13369376);
                    //释放掉屏幕的DC 
                    g1.ReleaseHdc(dc1);
                    //释放掉Bitmap的DC 
                    g2.ReleaseHdc(dc2);
                    //以JPG文件格式来保存 
                      MyImage.Save(@"C:\test.jpg", ImageFormat.Jpeg);
参照例子,截取屏幕,发现失真,只截取了图像的右下角,最左边和最上面的都没有截取到
不知为什么?!!                  

解决方案 »

  1.   

    有个简单的方法:
    Graphics.CopyFromScreen
      

  2.   

    应该是                    BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, 0, 0, 13369376); 出错了.
      

  3.   

    涉及COPY屏幕的全部代码就是上面的,哪里错了呢?改成多少呢
      

  4.   

      BitBlt()的定义在哪里?13369376是什么意思?
      

  5.   

     修改成 BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, -17, -80, 13369376)可以很大程序上改正,但想知道,这两个参数是以什么为依据的?归根结底的错误可能是: rect = Screen.GetWorkingArea(this);获取工作区的区域,这句话应该怎么改
      

  6.   

    你这个程序是从网上copy下来的吧,很有问题,你的左上角坐标永远是你打开的程序的左上角坐标开始的,可能这句话不太好说,就是说你指的屏幕dc的 0,0 点其实在你的程序中已经是你窗体的0,0点了,你的窗体位置变化,这个0,0也跟着变化,所以经常会空左边和上边那一块.我C#抓屏用的是:  http://bbs.51cto.com/archiver/tid-39783.html
    里的方法,调试完全通过! 请参考!