显示列表
 C#中捕获屏幕2008-09-02

通过调用系统的API实现

[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);


[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坐标
int dwRop // 光栅的操作值
);

private void button1_Click(object sender, EventArgs e)
{
    //创建显示器的DC
    IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);

    //由一个指定设备的句柄创建一个新的Graphics对象
    Graphics g1 = Graphics.FromHdc(dc1);

    //根据屏幕大小创建一个与之相同大小的Bitmap对象
    Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
    
    //根据此位图创建一个和其一样的Graphic对象
    Graphics g2 = Graphics.FromImage(bitmap);


    //获得屏幕的句柄
    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);


    bitmap.Save("c:\\1.jpg", ImageFormat.Jpeg);
}

返回摘要 | 分类(C#/CSharp) | 访问(7) | 编辑