这是我改装的,不都是我写的,使用这个静态函数就可以了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;
}
}
}
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;
}
}
}
解决方案 »
- C# WebBrowser 中实现图片保存
- socket
- HttpWebRequest ==============各位大哥帮忙看下,谢谢啦
- MD5问题
- 一个很菜的问题,希望有人能帮我看看
- 删除DatagridView 中记录的问题!!!
- 急gra.TranslateTransform(10, pic.Height / 2)将坐标系x,y都扩大了10倍,但线条的粗细也扩大了,我想只扩大坐标,不扩大线条,
- 入门级难题,难倒了我,System.DBNull.Value的问题
- 如何在此代码中实现dadatable导出Excel时,自动调整列宽和行宽?此方法是将数据写入一个空模板,空模板我默认为设置文本,因为导出的数据的列是可变的
- 菜鸟问题啊,C#怎样取得某字符串中某个位置的字符?
- 帮帮忙阿
- 用ADO.Net怎么得到数据库中表的一个列的定义长度(字符型数)?
{
// 获取此次图像
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)来做这个事情吧?