C#截屏代码
1、使用C#封装好的方法截屏:
Size sz = Screen.PrimaryScreen.Bounds.Size;
int width = sz.Width + 300;// 加300是为了测试双显示器时能否正常截屏
int height = sz.Height;
using (Bitmap bit = new Bitmap(width, height))
using (Graphics g = Graphics.FromImage(bit))
{
g.CopyFromScreen(this.Location, new Point(0, 0), bit.Size);
bit.Save(@"c:\b.png");
g.Dispose();
}
2、调用系统API进行截屏
using System.Runtime.InteropServices;
先定义外部方法:
[DllImport("gdi32.dll")]
static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr ptr);
然后截屏代码如下:
Size sz = Screen.PrimaryScreen.Bounds.Size;
int width = sz.Width + 300; // 加300是为了测试双显示器时能否正常截屏
int height = sz.Height;
//调用API截屏
IntPtr hDesk = GetDesktopWindow();
IntPtr hSrce = GetWindowDC(hDesk);
IntPtr hDest = CreateCompatibleDC(hSrce);
IntPtr hBmp = CreateCompatibleBitmap(hSrce, width, height);
IntPtr hOldBmp = SelectObject(hDest, hBmp);
if (BitBlt(hDest, 0, 0, width, height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
{
using (Bitmap bmp = Image.FromHbitmap(hBmp))
{
SelectObject(hDest, hOldBmp);
DeleteObject(hBmp);
DeleteDC(hDest);
ReleaseDC(hDesk, hSrce);
bmp.Save(@"c:\a.png");
bmp.Dispose();
}
}