这是我改装的,不都是我写的,使用这个静态函数就可以了GetBitmapFromScreen()
bitmap不用我说了吧using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Drawing.Imaging ;
using System.IO ;
namespace PrintScreen
{
/// <summary>
/// PrintScreenToBitmap 的摘要说明。
/// </summary>
public class PrintScreenToBitmap
{
public PrintScreenToBitmap()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
private 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 // 光栅的操作值
) ;
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
private static extern IntPtr CreateDC (
string lpszDriver , // 驱动名称
string lpszDevice , // 设备名称
string lpszOutput , // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
) ;
public static Bitmap GetBitmapFromScreen()
{
IntPtr dc1 = CreateDC ( "DISPLAY" , null , null , ( IntPtr ) null ) ;
return GetBitmapFromScreen(dc1,Screen.PrimaryScreen.Bounds.Width ,
Screen.PrimaryScreen.Bounds.Height);
}
public static Bitmap GetBitmapFromScreen(IntPtr dc1,int width,int height)
{
//创建显示器的DC
Graphics g1 = Graphics.FromHdc ( dc1 ) ;
//由一个指定设备的句柄创建一个新的Graphics对象
Bitmap MyImage = new Bitmap (width  ,height, g1 ) ;
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage ( MyImage ) ;
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc ( ) ;
//获得位图的句柄
IntPtr dc2 = g2.GetHdc ( ) ;
//把当前屏幕捕获到位图对象中
BitBlt ( dc2 , 0 , 0 , Screen.PrimaryScreen.Bounds.Width ,
Screen.PrimaryScreen.Bounds.Height , dc3 , 0 , 0 , 13369376 ) ;
//把当前屏幕拷贝到位图中
g1.ReleaseHdc ( dc3 ) ;
//释放屏幕句柄
g2.ReleaseHdc ( dc2 ) ;
//释放位图句柄
return MyImage;

}
}
}

解决方案 »

  1.   

    您看清楚了,我说的是异或(XOR)方法。不是一般的SRCCOPY方法!
      

  2.   

    public Bitmap GetXORImage(Bitmap PrevBMap)
    {
       // 获取此次图像
       IntPtr dcScreen = GetDC(IntPtr.Zero);
       Graphics g1 = Graphics.FromHdc(dcScreen);
       Rectangle rect = new Rectangle();
       rect = Screen.PrimaryScreen.Bounds;   // 获取上次图像          
       Bitmap XORBmap = PrevBMap;
       Graphics g2 = Graphics.FromImage ( XORBmap ) ;
       
       IntPtr dc1 = g1.GetHdc();
       IntPtr dc2 = g2.GetHdc ( ) ;

       //调用此API函数,实现屏幕捕获
       BitBlt( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 ,
                         0 , 6684742 ) ;//XOR方式
       g1.ReleaseHdc ( dc1 ) ;
       g2.ReleaseHdc ( dc2 ) ;
       XORBmap.Save("D:\\xormap.bmp",ImageFormat.Bmp); 《--------------问题
       PrevBmap = new Bitmap(rect.Width,rect.Height,g1); // 存放这一次拷贝的屏
                                                         // 幕
       g1.Dispose();
       g2.Dispose();
       return XORBmap;
    }
    在《----指出的地方,XORBmap存放这次拷贝的XOR屏幕图片,而PrevBmap想存放此次
    屏幕的真实图片以供下次异或比较。但是,第一次执行,PrevBmap就无法正确获取,而是一团漆黑。请问:如何获取当前屏幕图像?不大可能再用BitBlt(,,,srcCopy)来做这个事情吧?