C#模仿QQ截图功能

原创 2006年06月19日 15:52:00

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

 

C#制作QQ截图的自动框选功能的个人思路(三)<自动框选>

效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da...

C#窗体实现QQ截图功能

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

C# GDI+ 简单绘图 (三)----QQ截图功能

感谢大家的支持,这几天从早忙到晚,一个字累呀!!!现在挺困的,但是又不习惯这么早睡觉,哎~~还是利用这个时间继续来写第三篇吧.   前两篇已经基本向大家介绍了绘图的基本知识.那么,我就用我们上两篇所...
  • ja38911
  • ja38911
  • 2011年09月30日 08:56
  • 613

C#制作QQ截图的自动框选功能的个人思路(二)<设置Hook>

上一篇介绍了一下我的一个个人思路而已、、这一篇来分析分析代码、、、 主要分为两大部分 第一部分 就是 那个自动框选的那部分了啊 第二部分 就是设置Hook(不然窗体一直禁用啊) 先来说说Hook ...

C#制作QQ截图的自动框选功能的个人思路(一)<思路介绍>

源码连接: http://download.csdn.net/detail/crystal_lz/4118677    (2012-03-07 这个是框选功能 下载需要两分 )   http...

c# 仿QQ截图功能

  • 2009年09月18日 10:09
  • 229KB
  • 下载

WPF C#截图功能 仿qq截图

先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口button,开始截...

c#-模拟QQ截图功能

  • 2015年10月28日 11:14
  • 196KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#模仿QQ截图功能
举报原因:
原因补充:

(最多只允许输入30个字)