分享
 
 
 

C#模仿QQ截图功能

王朝c#·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

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

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有