很简陋的一个屏幕截图工具,支持任意尺寸。
效果图如下:
FullFrom是一个子窗体,当点击主窗体的截图按钮时,先从GDI+获取整个屏幕截图,传递 给FullForm,然后再将FullForm全屏最大化显示。
目前只支持单屏幕,多个屏幕未考虑。代码写的比较乱,注重功能实现。后续可以用钩子捕获全局系统按键。如ctrl+alt+a,捕获这三个按键进行截图。
public partial class FullScreen : Form
{
Image Img;
public FullScreen(Image img)
{
InitializeComponent();
Img = img;
this.KeyPreview = true;//窗体接受控件的KEY事件
}
Screen c = Screen.PrimaryScreen;
private void FullScreen_Load(object sender, EventArgs e)
{
this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
pictureBox1.BackgroundImage = Img;
getX = c.Bounds.Width;
getY = c.Bounds.Height;
}
/// <summary>
/// 鼠标左键是否按下
/// </summary>
bool flag_isDown = false;
/// <summary>
/// 鼠标左键是否抬起
/// </summary>
bool flag_isUp = false;
/// <summary>
/// 鼠标是否移动(左键按下的情况)
/// </summary>
bool flag_isMove = false;
Point MouseStart=new Point();
Point MouseNow = new Point();
/// <summary>
/// 截取矩形的宽
/// </summary>
int getX;
/// <summary>
/// 截取矩形的高
/// </summary>
int getY;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)//判断是否是鼠标左键
{
flag_isMove = false;//若鼠标左键按下,则该标志位为false
MouseStart = new Point(e.X, e.Y);//记录鼠标左键按下的位置
MouseNow = new System.Drawing.Point(0, 0);//清理
flag_isDown = true;//鼠标按下标志置为true
flag_isUp = false;//鼠标抬起标志置为false
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (flag_isDown && !flag_isUp)//左键按下且未抬起
{
MouseNow = new Point(e.X, e.Y);
getX = MouseNow.X - MouseStart.X;
getY = MouseNow.Y - MouseStart.Y;
flag_isMove = true;
pictureBox1.Refresh();
}
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
if (flag_isMove)
{
Pen p = new Pen(Color.Red, 2);
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
Rectangle rect = new Rectangle(MouseStart.X, MouseStart.Y, getX, getY);
g.DrawRectangle(p, rect);
string temp = "请点击鼠标右键保存或退出!";
Font ft = new Font("宋体", 14, FontStyle.Bold | FontStyle.Italic);
SizeF sf = g.MeasureString(temp, ft);
float str_x = 0;
float str_y = 0;
//处理字体显示,防止越界看不到
if (getX < sf.Width)
{
str_x = MouseStart.X - (sf.Width - getX);
}
else
{
str_x = MouseStart.X;
}
if (MouseStart.Y <= 0)
{
str_y = MouseNow.Y + 30;
}
else
{
str_y = MouseStart.Y - 30;
}
g.DrawString(temp, ft, Brushes.Red, str_x, str_y);
}
else
{
Pen p = new Pen(Color.Red, 10);
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
Rectangle rect = new Rectangle(0, 0, c.Bounds.Width, c.Bounds.Height);
g.DrawRectangle(p, rect);
g.DrawString("点击鼠标左键并拖动或点击鼠标右键保存全屏图片!", new Font("宋体", 20, FontStyle.Bold | FontStyle.Italic), Brushes.Red, 0, 20);
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
flag_isUp = true;
flag_isDown = false;
MouseNow = new Point(e.X, e.Y);
pictureBox1.Refresh();
}
}
private void FullScreen_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)//esc退出
{
this.Close();
}
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
if ((getX) != 0 && (getY) != 0)
{
this.TopMost = false;
//目标图大小
Bitmap b = new Bitmap(getX, getY);
Graphics g = Graphics.FromImage(b);
//目标图的矩形容器
Rectangle destRect = new Rectangle(0, 0, getX, getY);
//在原图上所截取的矩形区域
Rectangle srcRect = new Rectangle(MouseStart.X, MouseStart.Y, getX, getY);
g.DrawImage(Img, destRect, srcRect, GraphicsUnit.Pixel);
FileDialog sfd = new SaveFileDialog();
sfd.Filter = "图片|*.jpg|图片|*.bmp|图片|*.png";
if (sfd.ShowDialog() == DialogResult.OK)
{
b.Save(sfd.FileName);
this.Close();
}
g.Dispose();
}
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
}
主窗体代码如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Screen c = Screen.PrimaryScreen;
Image img;
FullScreen fs;
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Thread.Sleep(100);
img = CopyScreen();
fs = new FullScreen(img);
fs.Focus();
fs.Activate();
fs.ShowDialog();
this.Show();
this.Activate();
this.BringToFront();
}
/// <summary>
/// 获得屏幕的整张截图
/// </summary>
/// <returns></returns>
Image CopyScreen()
{
Image bt = new System.Drawing.Bitmap(c.Bounds.Width, c.Bounds.Height);
Graphics g = Graphics.FromImage(bt);
g.CopyFromScreen(0, 0, 0, 0, c.Bounds.Size, CopyPixelOperation.SourceCopy);
g.Save();
g.Dispose();
return bt;
}
}