全屏截图程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Threading;
namespace 全屏截图
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// private static Bitmap bitmap;
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
System.Threading.Thread.Sleep(200);
Bitmap bm = windowfullscreen();
pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBox1.Image = bm;
this.Visible = true;
// bm.Save(".\\1.jpg", ImageFormat.Jpeg);
// System.Diagnostics.Process.Start("1.jpg");
}
[System.Runtime.InteropServices.DllImport("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 // 光栅的操作值
);
public static Bitmap windowfullscreen()
{
Graphics gfull = Graphics.FromHwnd(IntPtr.Zero);
Bitmap bm = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, gfull);
Graphics gbitmap = Graphics.FromImage(bm);
IntPtr hdcscreen = gfull.GetHdc();
IntPtr hdcbitmap = gbitmap.GetHdc();
BitBlt(hdcbitmap, 0, 0, bm.Width, bm.Height, hdcscreen, 0, 0, 0x00CC0020);
gfull.ReleaseHdc(hdcscreen);
gbitmap.ReleaseHdc(hdcbitmap);
gfull.Dispose();
gbitmap.Dispose();
return bm;
}
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "全屏截图程序";
}
private void button2_Click_1(object sender, 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
{
pictureBox1.Image.Save(fileName, imgformat);
MessageBox.Show("图片已经成功保存!~~");
}
catch
{
MessageBox.Show("保存失败,你还没有截取过图片或已经清空图片!");
}
}
}
}
}
private bool mouseStatus = false;//鼠标状态,false为松开
private List rectList = new List();//存储所有画过的矩形
private Point startPoint;//鼠标按下的点
private Point endPoint;//
private Rectangle currRect;//当前正在绘制的举行
private int minStartX, minStartY, maxEndX, maxEndY;//最大重绘矩形的上下左
右的坐标,这样重绘的效率更高。
private void button3_Click(object sender, EventArgs e)
{
// Bitmap bp = new Bitmap(pictureBox1.Width,pictureBox1.Height);
// label1.DrawToBitmap(bp, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));
// bp.Save(@"d:\form2.bmp");
// ControlPaint.DrawReversibleFrame(new Rectangle(100, 100, 300, 300),Color.Transparent, FrameStyle.Thick);
Bitmap b = new Bitmap(currRect.Width,currRect.Height);
b.Save(@"d:\\1.bmp", ImageFormat.Jpeg);
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
mouseStatus = true;
startPoint.X = e.X;
startPoint.Y = e.Y;
//重新一个矩形,重置最大重绘矩形的上下左右的坐标
minStartX = e.X;
minStartY = e.Y;
maxEndX = e.X;
maxEndY = e.Y;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseStatus)
{
endPoint.X = e.X; endPoint.Y = e.Y;
//这一段是获取要绘制矩形的上下左右的坐标,如果不这样处理的话,只
有从左上开始往右下角才能画出矩形。
//这样处理的话,可以任意方向,当然中途可以更换方向。
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
minStartX = Math.Min(minStartX, realStartX);
minStartY = Math.Min(minStartY, realStartY);
maxEndX = Math.Max(maxEndX, realEndX);
maxEndY = Math.Max(maxEndY, realEndY);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
//一下是为了获取最大重绘矩形。
Rectangle refeshRect = new Rectangle(minStartX, minStartY, maxEndX - minStartX, maxEndY - minStartY);
refeshRect.Inflate(1, 1);//重绘矩形的大小扩展1个单位
this.Invalidate(refeshRect);//失效一个区域,并使其重绘。
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
mouseStatus = false;
endPoint.X = e.X; endPoint.Y = e.Y;
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX,
realEndY - realStartY);
this.Invalidate();//重绘整个界面
}
}
}