C#屏幕截图
今天通过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#屏幕截图的更多相关文章
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- 如何使用office2010插入屏幕截图
当我们习惯了用QQ的屏幕截图之后,当某一天我们在一台没有装QQ的办公电脑上,它装着office2010,我们可以实现用office来截图吗?其实Office2010深藏着犀利的截图工具. 插入图片到文 ...
- 屏幕截图、录像FastStone Capture
作为一款极其优秀好用的屏幕截图软件,FastStone Capture 具有体积小巧.功能强大.操作简便等优点,其方便的浮动工具条和便捷的快捷键堪称完美结合,截图后的图片编辑与保存选项也特别丰富和方便 ...
- cocos2dx 3.x(屏幕截图的两种方法)
[RenderTexture] RenderTexture这个动态纹理类,顾名思义就是可以动态创建纹理图片. 屏幕截图主要步骤: > 开始截图:render->begin(); > ...
- Ubuntu 14.04下安装功能强大的屏幕截图软件 Shutter
[注释]试用了一下,果然很强大,牛逼 一款功能强大的屏幕截图软件——Shutter,Shutter最基本的就是截图功能了,在设计上可以自由选定区域,同时选定之 后依然可以通过上下左右四个地方来改变选区 ...
- JAVA B/S系统实现客户端屏幕截图,Java版的QQ截图
简介:本方法首先需要抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏.Java实现QQ ...
- Selenium WebDriver屏幕截图(C#版)
Selenium WebDriver屏幕截图(C#版)http://www.automationqa.com/forum.php?mod=viewthread&tid=3595&fro ...
- C++实现的屏幕截图软件 v1.0
之前用win32做的屏幕截图软件,使用了好久,非常好用. 在2.0版本中增加了屏幕尺和颜色拾取功能,并且改用屏幕和内存DC双缓冲,彻底消灭了闪屏,可惜代码丢失了 好不容易找到1.0版本的代码,以后再重 ...
- Android 屏幕截图
1.同时按下电源键+音量下键截屏 PhoneWindowManager.java private void interceptScreenshotChord() { if (mScreenshotCh ...
随机推荐
- C#调用有有参有返的存储过程
(1)在SQL Server中建立如下的存储过程: set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[GetName ...
- 在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常ID ...
- Git是如何存储对象的
原文:http://gitbook.liuhui998.com/7_1.html 一.前言 所有的对象都以SHA值为索引用gzip格式压缩存储, 每个对象都包含了对象类型, 大小和内容. Git中存在 ...
- HTML——meta标签
<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任何内容.&l ...
- Python之调用WebService:suds
suds官方: https://fedorahosted.org/suds/wiki/Documentation 互联网公开WSDL: http://www.webxml.com.cn/zh_cn/w ...
- float 在内存中如何存储的
float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...
- centos7 systemctl 启动 Redis 失败
转自:http://sloger.info/posts/systemd-failed-to-start-redis-in-gentoo 今天启动 Redis 时阻塞很长时间,之后显示启动失败,启动状态 ...
- nginx和apache的一些比较
1.两者所用的驱动模式不同. nginx使用的是epoll的非阻塞模式事件驱动. apache使用的是select的阻塞模式事件驱动. 2.fastcgi和cgi的区别 当用户请求web服务的时候,w ...
- cxGRID中的字段怎么能以0.00的格式显示
CXGRID中的字段如何能以0.00的格式显示在CXGRID中如何让字段能以0.00的格式显示,我的字段是FLOAT类型,满意的马上给分! ------解决方案-------------------- ...
- MinGW平台 openjpeg-2.1.0 静态编译后未定义引用的解决方法
undefined reference to __imp_opj_xxx keyword: ffmpeg,openjpeg,OPJ_EXPORTS,OPJ_STATIC,opj_version,__i ...