今天通过C#来实现一个简单的屏幕截图功能。实现思路,获取鼠标按下去的位置和鼠标左键释放的位置,计算这个区域的宽度和高度。然后通过 Graphics.CopyFromScreen 方法便可以获取到屏幕截图了。

下面通过C#+WPF来实现这个功能,代码如下:

XAML:

<Window x:Class="WPFCaptureScreenShot.CaptureWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CaptureWindow"
AllowsTransparency="True"
WindowStyle="None"
Background="Black"
Opacity="0.1"
WindowState="Maximized"
MouseDown="CaptureWindow_MouseDown"
MouseMove="CaptureWindow_MouseMove">
<Canvas x:Name="CaptureCanvas"> </Canvas>
</Window>
    public partial class CaptureWindow : Window
{
private double x;
private double y;
private double width;
private double height; private bool isMouseDown = false; public CaptureWindow()
{
InitializeComponent();
} private void CaptureWindow_MouseDown(object sender, MouseButtonEventArgs e)
{
isMouseDown = true;
x = e.GetPosition(null).X;
y = e.GetPosition(null).Y;
} private void CaptureWindow_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if(isMouseDown)
{
// 1. 通过一个矩形来表示目前截图区域
System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle();
double dx = e.GetPosition(null).X;
double dy = e.GetPosition(null).Y;
double rectWidth = Math.Abs(dx - x);
double rectHeight = Math.Abs(dy - y);
SolidColorBrush brush = new SolidColorBrush(Colors.White);
rect.Width = rectWidth;
rect.Height = rectHeight;
rect.Fill = brush;
rect.Stroke = brush;
rect.StrokeThickness = ;
if (dx < x)
{
Canvas.SetLeft(rect, dx);
Canvas.SetTop(rect, dy);
}
else
{
Canvas.SetLeft(rect, x);
Canvas.SetTop(rect, y);
} CaptureCanvas.Children.Clear();
CaptureCanvas.Children.Add(rect); if(e.LeftButton == MouseButtonState.Released)
{
CaptureCanvas.Children.Clear();
// 2. 获得当前截图区域
width = Math.Abs(e.GetPosition(null).X - x);
height = Math.Abs(e.GetPosition(null).Y - y); if(e.GetPosition(null).X > x)
{
CaptureScreen(x, y, width, height);
}
else
{
CaptureScreen(e.GetPosition(null).X, e.GetPosition(null).Y, width, height);
} isMouseDown = false;
x = 0.0;
y = 0.0;
this.Close();
}
}
} private void CaptureScreen(double x, double y, double width, double height)
{
int ix = Convert.ToInt32(x);
int iy = Convert.ToInt32(y);
int iw = Convert.ToInt32(width);
int ih = Convert.ToInt32(height); System.Drawing.Bitmap bitmap = new Bitmap(iw, ih);
using(System.Drawing.Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(ix, iy, , , new System.Drawing.Size(iw, ih)); SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "Png Files|*.png";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
bitmap.Save(dialog.FileName, ImageFormat.Png);
}
}
}

运行效果:

源代码可以点击这里下载。
如果你有其他方式实现,欢迎与我分享。如果对代码有疑问,可以在评论中指出。感谢阅读。

C#屏幕截图的更多相关文章

  1. 使用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

  2. 如何使用office2010插入屏幕截图

    当我们习惯了用QQ的屏幕截图之后,当某一天我们在一台没有装QQ的办公电脑上,它装着office2010,我们可以实现用office来截图吗?其实Office2010深藏着犀利的截图工具. 插入图片到文 ...

  3. 屏幕截图、录像FastStone Capture

    作为一款极其优秀好用的屏幕截图软件,FastStone Capture 具有体积小巧.功能强大.操作简便等优点,其方便的浮动工具条和便捷的快捷键堪称完美结合,截图后的图片编辑与保存选项也特别丰富和方便 ...

  4. cocos2dx 3.x(屏幕截图的两种方法)

    [RenderTexture] RenderTexture这个动态纹理类,顾名思义就是可以动态创建纹理图片. 屏幕截图主要步骤: > 开始截图:render->begin(); >  ...

  5. Ubuntu 14.04下安装功能强大的屏幕截图软件 Shutter

    [注释]试用了一下,果然很强大,牛逼 一款功能强大的屏幕截图软件——Shutter,Shutter最基本的就是截图功能了,在设计上可以自由选定区域,同时选定之 后依然可以通过上下左右四个地方来改变选区 ...

  6. JAVA B/S系统实现客户端屏幕截图,Java版的QQ截图

    简介:本方法首先需要抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏.Java实现QQ ...

  7. Selenium WebDriver屏幕截图(C#版)

    Selenium WebDriver屏幕截图(C#版)http://www.automationqa.com/forum.php?mod=viewthread&tid=3595&fro ...

  8. C++实现的屏幕截图软件 v1.0

    之前用win32做的屏幕截图软件,使用了好久,非常好用. 在2.0版本中增加了屏幕尺和颜色拾取功能,并且改用屏幕和内存DC双缓冲,彻底消灭了闪屏,可惜代码丢失了 好不容易找到1.0版本的代码,以后再重 ...

  9. Android 屏幕截图

    1.同时按下电源键+音量下键截屏 PhoneWindowManager.java private void interceptScreenshotChord() { if (mScreenshotCh ...

随机推荐

  1. C#调用有有参有返的存储过程

    (1)在SQL Server中建立如下的存储过程: set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[GetName ...

  2. 在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作

    Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常ID ...

  3. Git是如何存储对象的

    原文:http://gitbook.liuhui998.com/7_1.html 一.前言 所有的对象都以SHA值为索引用gzip格式压缩存储, 每个对象都包含了对象类型, 大小和内容. Git中存在 ...

  4. HTML——meta标签

    <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任何内容.&l ...

  5. Python之调用WebService:suds

    suds官方: https://fedorahosted.org/suds/wiki/Documentation 互联网公开WSDL: http://www.webxml.com.cn/zh_cn/w ...

  6. float 在内存中如何存储的

    float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准:    一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...

  7. centos7 systemctl 启动 Redis 失败

    转自:http://sloger.info/posts/systemd-failed-to-start-redis-in-gentoo 今天启动 Redis 时阻塞很长时间,之后显示启动失败,启动状态 ...

  8. nginx和apache的一些比较

    1.两者所用的驱动模式不同. nginx使用的是epoll的非阻塞模式事件驱动. apache使用的是select的阻塞模式事件驱动. 2.fastcgi和cgi的区别 当用户请求web服务的时候,w ...

  9. cxGRID中的字段怎么能以0.00的格式显示

    CXGRID中的字段如何能以0.00的格式显示在CXGRID中如何让字段能以0.00的格式显示,我的字段是FLOAT类型,满意的马上给分! ------解决方案-------------------- ...

  10. MinGW平台 openjpeg-2.1.0 静态编译后未定义引用的解决方法

    undefined reference to __imp_opj_xxx keyword: ffmpeg,openjpeg,OPJ_EXPORTS,OPJ_STATIC,opj_version,__i ...