知识大全 用C#实现全屏幕截图

Posted

篇首语:不怕山高,就怕脚软。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用C#实现全屏幕截图相关的知识,希望对你有一定的参考价值。

用C#实现全屏幕截图  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  今天一位同事想写一个全屏幕截图的代码 当然要实现的第一步是能够获取整个屏幕的位图 记得Win API的CreateDC BitBlt等函数可以使用 于是上网查了下 果然屏幕截图用这些函数 但winform已经可以把API都忘记了 所以得寻找一个无Win API的实现方式 综合了网上的实现 以及自己的一些设计 实现思路如下 开始截图时 创建一个与屏幕大小一样的位图 然后用Graphics CopyFromScreen()把屏幕位图拷贝到该位图上 这是很关键的一步 这样所有的操作就都可以在该位图上进行了 而无实际屏幕无关了

  int width = Screen PrimaryScreen Bounds Width;

  int height = Screen PrimaryScreen Bounds Height;

  Bitmap bmp = new Bitmap(width height);

  using (Graphics g = Graphics FromImage(bmp))

  g CopyFromScreen( new Size(width height));

  

   接下来为了方便在这之上进行截图 有一个很重要的设计实现方式 用全屏幕窗体代替现有真实屏幕 这样就可以把截图过程的所有操作都在那个窗体上实现(该窗体设置成无边框 高宽等于屏幕大小即可) 另外为了显示掩蔽效果(只能正常显示选择的部分屏幕内容 而其实部分用一个如半透明层覆蓋) 就添加一层半透明位置位图 具体代码如下

  public partial class FullScreenForm : Form

  private Rectangle rectSelected = Rectangle Empty;

  private bool isClipping = false;

  private Bitmap screen;

  private Bitmap coverLayer = null;

  private Color coverColor;

  private Brush rectBrush = null;

  private Bitmap resultBmp = null;

  public FullScreenForm(Bitmap screen)

  InitializeComponent();

  int width = Screen PrimaryScreen Bounds Width;

  int height = Screen PrimaryScreen Bounds Height;

  coverLayer = new Bitmap(width height);

  coverColor = Color FromArgb( );

  rectBrush = new SolidBrush(coverColor);

  using (Graphics g = Graphics FromImage(coverLayer))

  g Clear(coverColor);

  

  this Bounds = new Rectangle( width height);

  this screen = screen;

  this DoubleBuffered = true;

  

  protected override void OnMouseDown(MouseEventArgs e)

  if (e Button == MouseButtons Left)

  isClipping = true;

  rectSelected Location = e Location;

  

  else if (e Button == MouseButtons Right)

  this DialogResult = DialogResult OK;

  

  

  protected override void OnMouseMove(MouseEventArgs e)

  if (e Button == MouseButtons Left && isClipping)

  rectSelected Width = e X rectSelected X;

  rectSelected Height = e Y rectSelected Y;

  this Invalidate();

  

  

  protected override void OnMouseUp(MouseEventArgs e)

  if (e Button == MouseButtons Left && isClipping)

  rectSelected Width = e X rectSelected X;

  rectSelected Height = e Y rectSelected Y;

  this Invalidate();

  resultBmp = new Bitmap(rectSelected Width rectSelected Height);

  using (Graphics g = Graphics FromImage(resultBmp))

  g DrawImage(screen new Rectangle( rectSelected Width rectSelected Height) rectSelected GraphicsUnit Pixel);

  

  this DialogResult = DialogResult OK;

  

  

  protected override void OnPaint(PaintEventArgs e)

  Graphics g = e Graphics;

  g DrawImage(screen );

  g DrawImage(coverLayer );

  PaintRectangle();

  

  protected override void OnPaintBackground(PaintEventArgs e)

  

  protected override void OnKeyDown(KeyEventArgs e)

  if (e KeyCode == Keys Escape)

  this DialogResult = DialogResult Cancel;

  

  

  private void PaintRectangle()

  using (Graphics g = Graphics FromImage(coverLayer))

  g Clear(coverColor);

  GraphicsPath path = new GraphicsPath();

  path AddRectangle(this Bounds);

  path AddRectangle(rectSelected);

  g FillPath(rectBrush path);

  g DrawRectangle(Pens Blue rectSelected);

  

  

  public Bitmap ResultBitmap

  get return resultBmp;

  

  

cha138/Article/program/net/201311/12191

相关参考