浏览主站 | 站长合租 | 新闻资讯 | 站长学院 | 站长盈利 | HTML教程 | 网址导航 | 站长周刊 | 会员投稿 | 滚动新闻 | RSS
发新话题
打印

C#模仿QQ截图功能

C#模仿QQ截图功能

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

主文件

CaptureScreenForm.cs

using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.[wiki]windows[/wiki].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 Dis[wiki]POS[/wiki]e( bool disposing )  {   if( disposing )   {    if (components != null)     {     components.Dispose();    }   }   base.Dispose( disposing );  }

  #region Windows 窗体设计器生成的代码  /// <summary>  /// 设计器支持所需的方法 - 不要使用代码[wiki]编辑[/wiki]器修改  /// 此方法的内容。  /// </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 = "[wiki]鼠标[/wiki]截取";   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 = tr[wiki]UE[/wiki];   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>  /// 应用[wiki]程序[/wiki]的主入口点。  /// </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, // 目标[wiki]对象[/wiki]的左上角的X坐标    int nYDest, // 目标对象的左上角的X坐标    int nWidth, // 目标对象的矩形的宽度    int nHeight, // 目标对象的矩形的长度    IntPtr hdcSrc, // 源设备的句柄    int nXSrc, // 源对象的左上角的X坐标    int nYSrc, // 源对象的左上角的X坐标    System.Int32 dwRop // 光栅的操作值    );

  private void exitBtn_Click([wiki]object[/wiki] 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|[wiki]BMP[/wiki]|*.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;          //   //[wiki]系统[/wiki]生成定义   //   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.Bot[wiki]Tom[/wiki];      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;  }  } }

TOP

发新话题