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

来源:互联网 发布:js 函数返回true 编辑:程序博客网 时间:2024/04/28 21:20

前阵子改了段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;   } } 



原创粉丝点击