【转载】用C#语言实现类似QQ的截图功能

前阵子改了段C#截图功能的代码,现贴上来希望对大家有用

主文件

CaptureScreenForm.cs:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace CaptureScreen
{
/// <summary>
/// CaptureScreenForm 的摘要说明。
/// </summary>
public class CaptureScreenForm : System.Windows.Forms.Form
{
   private System.Windows.Forms.PictureBox picbox;
   private System.Windows.Forms.Button exitBtn;
   private System.Windows.Forms.Button aboutBtn;
   private System.Windows.Forms.Button ClearBtn;
   private System.Windows.Forms.Button saveBtn;
   private System.Windows.Forms.Button fullScreenBtn;
   private System.Windows.Forms.Button mouseCaptureBtn;
   public static Image image = null ;
   private System.Windows.Forms.Panel panel1;
   /// <summary>
   /// 必需的设计器变量。
   /// </summary>
   private System.ComponentModel.Container components = null;
   public CaptureScreenForm()
   {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent();
    //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
   }
   /// <summary>
   /// 清理所有正在使用的资源。
   /// </summary>
   protected override void Dispose( bool disposing )
   {
    if( disposing )
    {
     if (components != null) 
     {
      components.Dispose();
     }
    }
    base.Dispose( disposing );
   }
   #region Windows 窗体设计器生成的代码
   /// <summary>
   /// 设计器支持所需的方法 - 不要使用代码编辑器修改
   /// 此方法的内容。
   /// </summary>
   private void InitializeComponent()
   {
    this.picbox = new System.Windows.Forms.PictureBox();
    this.fullScreenBtn = new System.Windows.Forms.Button();
    this.mouseCaptureBtn = new System.Windows.Forms.Button();
    this.ClearBtn = new System.Windows.Forms.Button();
    this.saveBtn = new System.Windows.Forms.Button();
    this.aboutBtn = new System.Windows.Forms.Button();
    this.exitBtn = new System.Windows.Forms.Button();
    this.panel1 = new System.Windows.Forms.Panel();
    this.panel1.SuspendLayout();
    this.SuspendLayout();
    // 
    // picbox
    // 
    this.picbox.Location = new System.Drawing.Point(0, 40);
    this.picbox.Name = "picbox";
    this.picbox.Size = new System.Drawing.Size(680, 312);
    this.picbox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
    this.picbox.TabIndex = 0;
    this.picbox.TabStop = false;
    // 
    // fullScreenBtn
    // 
    this.fullScreenBtn.Location = new System.Drawing.Point(0, 0);
    this.fullScreenBtn.Name = "fullScreenBtn";
    this.fullScreenBtn.Size = new System.Drawing.Size(96, 32);
    this.fullScreenBtn.TabIndex = 1;
    this.fullScreenBtn.Text = "全屏截取";
    this.fullScreenBtn.Click += new System.EventHandler(this.fullScreenBtn_Click);
    // 
    // mouseCaptureBtn
    // 
    this.mouseCaptureBtn.Location = new System.Drawing.Point(120, 0);
    this.mouseCaptureBtn.Name = "mouseCaptureBtn";
    this.mouseCaptureBtn.Size = new System.Drawing.Size(96, 32);
    this.mouseCaptureBtn.TabIndex = 2;
    this.mouseCaptureBtn.Text = "鼠标截取";
    this.mouseCaptureBtn.Click += new System.EventHandler(this.mouseCaptureBtn_Click);
    // 
    // ClearBtn
    // 
    this.ClearBtn.Location = new System.Drawing.Point(240, 0);
    this.ClearBtn.Name = "ClearBtn";
    this.ClearBtn.Size = new System.Drawing.Size(88, 32);
    this.ClearBtn.TabIndex = 3;
    this.ClearBtn.Text = "清除截取图片";
    this.ClearBtn.Click += new System.EventHandler(this.ClearBtn_Click);
    // 
    // saveBtn
    // 
    this.saveBtn.Location = new System.Drawing.Point(352, 0);
    this.saveBtn.Name = "saveBtn";
    this.saveBtn.Size = new System.Drawing.Size(96, 32);
    this.saveBtn.TabIndex = 4;
    this.saveBtn.Text = "保存截取图片";
    this.saveBtn.Click += new System.EventHandler(this.saveBtn_Click);
    // 
    // aboutBtn
    // 
    this.aboutBtn.Location = new System.Drawing.Point(472, 0);
    this.aboutBtn.Name = "aboutBtn";
    this.aboutBtn.Size = new System.Drawing.Size(96, 32);
    this.aboutBtn.TabIndex = 5;
    this.aboutBtn.Text = "关   于";
    this.aboutBtn.Click += new System.EventHandler(this.aboutBtn_Click);
    // 
    // exitBtn
    // 
    this.exitBtn.Location = new System.Drawing.Point(592, 0);
    this.exitBtn.Name = "exitBtn";
    this.exitBtn.Size = new System.Drawing.Size(88, 32);
    this.exitBtn.TabIndex = 6;
    this.exitBtn.Text = "退   出";
    this.exitBtn.Click += new System.EventHandler(this.exitBtn_Click);
    // 
    // panel1
    // 
    this.panel1.Controls.Add(this.fullScreenBtn);
    this.panel1.Controls.Add(this.mouseCaptureBtn);
    this.panel1.Controls.Add(this.ClearBtn);
    this.panel1.Controls.Add(this.saveBtn);
    this.panel1.Controls.Add(this.aboutBtn);
    this.panel1.Controls.Add(this.exitBtn);
    this.panel1.Location = new System.Drawing.Point(0, 0);
    this.panel1.Name = "panel1";
    this.panel1.Size = new System.Drawing.Size(680, 32);
    this.panel1.TabIndex = 7;
    // 
    // CaptureScreenForm
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.AutoScroll = true;
    this.ClientSize = new System.Drawing.Size(696, 358);
    this.Controls.Add(this.panel1);
    this.Controls.Add(this.picbox);
    this.Name = "CaptureScreenForm";
    this.Text = "截取屏幕";
    this.panel1.ResumeLayout(false);
    this.ResumeLayout(false);
   }
   #endregion
   /// <summary>
   /// 应用程序的主入口点。
   /// </summary>
   [STAThread]
   static void Main() 
   {
    Application.Run(new CaptureScreenForm());
   }
   protected override void OnPaint(PaintEventArgs e) 
   { 
    base.OnPaint (e); 
    if(image != null) 
    { 
     this.picbox.Image = image; 
    } 
    else 
    { 
     this.picbox.Image = null; 
     this.picbox.Refresh();
    } 
   } 

   // 引用API
   [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] 
   public 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 // 光栅的操作值 
    ); 

   private void exitBtn_Click(object sender, System.EventArgs e)
   {
    Application.Exit();
   }
   private void aboutBtn_Click(object sender, System.EventArgs e)
   {
    MessageBox.Show("Code by Star in 2006-3-17,E_mail: ygh_01@163.com ,thank you to use this.");
   }
   private void ClearBtn_Click(object sender, System.EventArgs e)
   {
    CaptureScreenForm.image = null;
    this.Invalidate();
   }
   private void saveBtn_Click(object sender, System.EventArgs e)
   {
    bool isSave = true;
    SaveFileDialog saveImageDialog = new SaveFileDialog();
    saveImageDialog.Title = "Capture screen image save dialog";
    saveImageDialog.Filter= @"jpeg|*.jpg|bmp|*.bmp|gif|*.gif";
    if(saveImageDialog.ShowDialog() == DialogResult.OK)
    {
      string fileName = saveImageDialog.FileName.ToString();
     
     if(fileName != "" && fileName != null)
     {
      string fileExtName = fileName.Substring(fileName.LastIndexOf(".")+1).ToString();
      System.Drawing.Imaging.ImageFormat imgformat = null;     

      if(fileExtName!="")
      {
       switch(fileExtName) 
       { 
        case "jpg": 
         imgformat = System.Drawing.Imaging.ImageFormat.Jpeg; 
         break; 
        case "bmp": 
         imgformat = System.Drawing.Imaging.ImageFormat.Bmp; 
         break; 
        case "gif": 
         imgformat = System.Drawing.Imaging.ImageFormat.Gif; 
         break; 
        default: 
         MessageBox.Show("只能存取为: jpg,bmp,gif 格式"); 
         isSave = false;
         break; 
       } 
      }
      //默认保存为JPG格式
      if(imgformat == null)
      {
       imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
      }
                    
      if(isSave)
      {
       try
       {
        CaptureScreenForm.image.Save(fileName,imgformat);
        MessageBox.Show("图片已经成功保存!~~");
       }
       catch
       {
        MessageBox.Show("保存失败,你还没有截取过图片或已经清空图片!");
       }
      }
     }
    }
   }
   private void fullScreenBtn_Click(object sender, System.EventArgs e)
   {
       CaptureScreenForm.image = windowFullScreen();
    picbox.Image = CaptureScreenForm.image;
   }
   public static Bitmap windowFullScreen()
   {
    //建立屏幕Graphics
    Graphics grpScreen = Graphics.FromHwnd(IntPtr.Zero);
    //根据屏幕大小建立位图
    Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height,grpScreen);
    //建立位图相关Graphics
    Graphics grpBitmap = Graphics.FromImage(bitmap);
             //建立屏幕上下文
    IntPtr hdcScreen = grpScreen.GetHdc();
    //建立位图上下文
    IntPtr hdcBitmap = grpBitmap.GetHdc();
    //将屏幕捕获保存在图位中
    BitBlt(hdcBitmap,0,0,bitmap.Width,bitmap.Height,hdcScreen,0,0,0x00CC0020);
    //关闭位图句柄
    grpBitmap.ReleaseHdc(hdcBitmap);
    //关闭屏幕句柄
    grpScreen.ReleaseHdc(hdcScreen);
    //释放位图对像
    grpBitmap.Dispose();
    //释放屏幕对像
    grpScreen.Dispose();
    //返回捕获位图
    return bitmap;
   }
   private void mouseCaptureBtn_Click(object sender, System.EventArgs e)
   {
    MouseCaptureForm mouseCapture = new MouseCaptureForm();
    mouseCapture.Show();
   }
}
}

另一个截屏文件:

MouseCaptureForm.cs

using System; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
namespace CaptureScreen
{ 
/// <summary> 
/// MouseCaptureForm 的摘要说明。 
/// </summary> 
public class MouseCaptureForm : System.Windows.Forms.Form 
{ 
   /// <summary> 
   /// 必需的设计器变量。 
   /// </summary> 
   // 
   //自定义变量 
   // 
   private Point pot; 
   private Rectangle area = Rectangle.Empty; 
   private Image img; 
   private int index = -1; 
   private string noselectString    =   "\n.请按下鼠标左键不放拖动选取截图区域\n\n .单击鼠标右键或按ESC取消截图";
   private string selectingString   =   "\n.松开鼠标左键确定选取范围\n\n.按ESC重新选择";
   private string selectedString    =   "\n.按鼠标左键调整选择范围\n\n .双击鼠标左键保存截图 \n\n.按鼠标右键重新选择 \n\n.ESC键取消截图";
   private System.Windows.Forms.Label tiptext;
        
   // 
   //系统生成定义 
   // 
   private System.ComponentModel.Container components = null; 
   public MouseCaptureForm() 
   { 
    this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds; 
    this.BackgroundImage = CaptureScreenForm.windowFullScreen(); 
    // 
    // Windows 窗体设计器支持所必需的 
    // 
    InitializeComponent(); 
    // 
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 
    // 
   } 
   /// <summary> 
   /// 清理所有正在使用的资源。 
   /// </summary> 
   protected override void Dispose( bool disposing ) 
   { 
    if( disposing ) 
    { 
     if(components != null) 
     { 
      components.Dispose(); 
     } 
    } 
    base.Dispose( disposing ); 
   } 
   #region Windows 窗体设计器生成的代码 
   /// <summary> 
   /// 设计器支持所需的方法 - 不要使用代码编辑器修改 
   /// 此方法的内容。 
   /// </summary> 
   private void InitializeComponent() 
   { 
    this.tiptext = new System.Windows.Forms.Label();
    this.SuspendLayout();
    //
// tiptext
    // 
    this.tiptext.BackColor = System.Drawing.Color.FromArgb(((System.Byte)(192)), ((System.Byte)(192)), ((System.Byte)(255)));
    this.tiptext.ForeColor = System.Drawing.Color.White;
    this.tiptext.Location = new System.Drawing.Point(10, 10);
    this.tiptext.Name = "tiptext";
    this.tiptext.Size = new System.Drawing.Size(166, 140);
    this.tiptext.TabIndex = 0;
    this.tiptext.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tiptext_MouseMove);
    // 
    // MouseCaptureForm
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(456, 320);
    this.Controls.Add(this.tiptext);
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    this.Name = "MouseCaptureForm";
    this.ShowInTaskbar = false;
    this.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultBounds;
    this.Text = "鼠标截屏";
    this.TopMost = true;
    this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MouseCaptureForm_KeyDown);
    this.Load += new System.EventHandler(this.MouseCaptureForm_Load);
    this.DoubleClick += new System.EventHandler(this.MouseCaptureForm_DoubleClick);
    this.ResumeLayout(false);
   } 

   #endregion 
   /// <summary> 
   /// 重载MouseDown 
   /// </summary> 
   /// 
   protected override void OnMouseDown(MouseEventArgs e) 
   {    
    base.OnMouseDown (e); 
     { 
    if(this.area == Rectangle.Empty && e.Button == MouseButtons.Left) 
    { 
     this.tiptext.Text = selectingString;
     this.area.Location = new Point(e.X,e.Y); 
    } 
    this.pot = new Point(e.X,e.Y); 
    this.index = this.GetSelectedHandle(new Point(e.X,e.Y)); 
    this.SetCursor();    
     } 
   } 
   /// <summary> 
   /// 设置鼠标方案 
   /// </summary> 
   private void SetCursor() 
   { 
    Cursor cr = Cursors.Default;

    if(index == 1 || index == 5) 
    { 
     cr = Cursors.SizeNWSE; 
    } 
    else if(index == 2 || index == 6) 
    { 
     cr = Cursors.SizeNS; 
    } 
    else if(index == 3 || index == 7) 
    { 
     cr = Cursors.SizeNESW; 
    } 
    else if(index == 4 || index == 8) 
    { 
     cr = Cursors.SizeWE; 
    } 
    else if(index == 0) 
    { 
     cr = Cursors.SizeAll; 
    } 
    Cursor.Current = cr; 
   } 
   protected override void OnPaint(PaintEventArgs e) 
   { 
    base.OnPaint(e); 
    e.Graphics.DrawRectangle(new Pen(this.ForeColor),this.area); 

    for(int i = 1;i < 9;i++) 
    { 
     e.Graphics.FillRectangle(new SolidBrush(Color.Green),this.GetHandleRect(i)); 
    } 
   } 
   private Rectangle GetHandleRect(int index) 
   { 
    Point point = GetHandle(index); 
    return new Rectangle(point.X - 3, point.Y - 3, 6, 6); 
   } 
   private Point GetHandle(int index) 
   { 
    int x, y, xCenter, yCenter; 
    xCenter = area.X + area.Width/2; 
    yCenter = area.Y + area.Height/2; 
    x = area.X; 
    y = area.Y; 
    switch ( index ) 
    { 
     case 1: 
      x = area.X; 
      y = area.Y; 
      break; 
     case 2: 
      x = xCenter; 
      y = area.Y; 
      break; 
     case 3: 
      x = area.Right; 
      y = area.Y; 
      break; 
     case 4: 
      x = area.Right; 
      y = yCenter; 
      break; 
     case 5: 
      x = area.Right; 
      y = area.Bottom; 
      break; 
     case 6: 
      x = xCenter; 
      y = area.Bottom; 
      break; 
     case 7: 
      x = area.X; 
      y = area.Bottom; 
      break; 
     case 8: 
      x = area.X; 
      y = yCenter; 
      break; 
    } 
    return new Point(x, y); 
   } 
   protected override void OnMouseUp(MouseEventArgs e) 
   { 
    base.OnMouseUp (e); 
    int left = area.Left; 
    int top = area.Top; 
    int right = area.Right; 
    int bottom = area.Bottom; 
    area.X = Math.Min(left,right); 
    area.Y = Math.Min(top,bottom); 
    area.Width = Math.Abs(left-right); 
    area.Height = Math.Abs(top-bottom); 
    this.tiptext.Text = selectedString;
    if(e.Button == MouseButtons.Right) 
    { 
     if(this.area == Rectangle.Empty) 
     { 
      this.Close();
     } 
     else 
     { 
      this.area=Rectangle.Empty; 
      this.Invalidate(); 
     } 
    } 
    this.index = this.GetSelectedHandle(new Point(e.X,e.Y)); 
    this.SetCursor(); 
   } 
   private int GetSelectedHandle(Point p) 
   { 
    int index = -1; 
    for(int i = 1;i < 9;i++) 
    { 
     if(GetHandleRect(i).Contains(p)) 
     { 
      index=i; 
      break; 
     } 
    } 
    if(this.area.Contains(p))index = 0; 
    return index; 
   } 
   protected override void OnMouseMove(MouseEventArgs e) 
   { 
    base.OnMouseMove (e); 
    if(this.Capture) 
    { 
     this.MoveHandleTo(new Point(e.X,e.Y)); 
     this.Invalidate(); 
    } 
    else 
    { 
     this.index = this.GetSelectedHandle(new Point(e.X,e.Y)); 
     this.SetCursor(); 
    } 
   } 
   private void MoveHandleTo(Point point) 
   { 
    int left = area.Left; 
    int top = area.Top; 
    int right = area.Right; 
    int bottom = area.Bottom; 
    switch ( index ) 
    { 
     case 0: 
      area.X +=point.X - this.pot.X; 
      area.Y += point.Y - pot.Y; 
      this.pot = point; 
      return; 
     case 1: 
      left = point.X; 
      top = point.Y; 
      break; 
     case 2: 
      top = point.Y; 
      break; 
     case 3: 
      right = point.X; 
      top = point.Y; 
      break; 
     case 4: 
      right = point.X; 
      break; 
     case 5: 
      right = point.X; 
      bottom = point.Y; 
      break; 
     case 6: 
      bottom = point.Y; 
      break; 
     case 7: 
      left = point.X; 
      bottom = point.Y; 
      break; 
     case 8: 
      left = point.X; 
      break; 
    } 
    this.pot = point; 
    area.X = left; 
    area.Y = top; 
    area.Width = right - left; 
    area.Height = bottom - top; 
   } 
   private void MouseCaptureForm_DoubleClick(object sender, System.EventArgs e) 
   { 
    //修正截取图片过界提示内存不足BUG
    int left    =   area.Left;
    int right   =   area.Right;
    int top     =   area.Top;
    int bottom =   area.Bottom;
    if(left < Screen.PrimaryScreen.Bounds.Left)
    {left = Screen.PrimaryScreen.Bounds.Left; }
    if(right > Screen.PrimaryScreen.Bounds.Right ) 
    {right = Screen.PrimaryScreen.Bounds.Right;}
    if(top < Screen.PrimaryScreen.Bounds.Top)
    {top = Screen.PrimaryScreen.Bounds.Top;}
    if(bottom > Screen.PrimaryScreen.Bounds.Bottom)
    {bottom = Screen.PrimaryScreen.Bounds.Bottom;}
    area.X = left;
    area.Y = top;
    area.Width = right - left;
    area.Height = bottom - top;
    //截取选择区域图片
    Bitmap bm   = new Bitmap(this.BackgroundImage);
    this.img = bm.Clone(this.area,System.Drawing.Imaging.PixelFormat.Format16bppArgb1555); 
    CaptureScreenForm.image = img; 
    CaptureScreenForm.ActiveForm.Invalidate(); 
    this.Close(); 
   } 
   private void MouseCaptureForm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
   { 
    if(e.KeyData == Keys.Escape && System.Windows.Forms.Button.MouseButtons == MouseButtons.Left) 
    { 
     this.area=Rectangle.Empty; 
     this.Invalidate(); 
     tiptext.Text = noselectString;
    }
    else if(e.KeyData == Keys.Escape)
    {this.Close();}
   }
   private void tiptext_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
   {
    if (tiptext.Location.X == 10 && tiptext.Location.Y == 10)
    {
     Point formloc = new Point((Screen.PrimaryScreen.Bounds.Width - 176),10) ;
     tiptext.Location = formloc;
    }
    else
    {tiptext.Location = new Point(10,10);}     
   }
   private void MouseCaptureForm_Load(object sender, System.EventArgs e)
   {
    tiptext.Text = noselectString;
   } 
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值