今天通过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 ...
随机推荐
-
javascript实现当前页面截屏
javascript实现当前页面截屏 一.前言 有客户要求能对用户当前页面进行指定区域截屏,类似qq截屏的实现效果.比如用户在处理工作的时候,将当前页面录入后的一些信息进行截图下载保存.但又不能安装任 ...
-
C++Builder设置完BorderStyle的值为none,以后如何实现窗口的移动和拉伸
在.h 文件中声明变量private: void __fastcall WndProc(TMessage &Msg);// User declarations: 在.cpp中实现下面的函数 v ...
-
visual studio 2012 的制作ActiveX、打包和发布[转]
开发环境是Vs 2012 Framework 4.0 源地址:http://www.cnblogs.com/li-peng/p/3455247.html 源码和制作工具在文章最下边 一. Activ ...
-
基于 CentOS7 的 Kubernetes 集群
一.环境 相关主机 master 192.168.12.197 minion 192.168.12.198~232 etcd 192.168.12.233~236 相关软件 OS CentOS 7 软 ...
-
XML巩固
一.XML基础 1.XML区分大小写, 2.XML属性值必须有引号(单引双引均可) 3.XML必须有根元素 4.一些特殊字符的需要用实体引用来替换 < < 小于 > > 大于 ...
-
Orchard开源ASP.NET MVC CMS简介
项目简介: Orchard CMS 是一个免费的开放源代码内容管理系统,让用户可在 Microsoft ASP.NET MVC 平台上快速创建网站.它基于灵活的扩展性框架构建,使开发人员和定制人员可通 ...
-
Android自定义UI的实现和应用
在Android项目开发中,不可避免的要遇到自定义的UI,用较好的体验去讨好UED妹子和交互设计师手下留情~几个迭代下来,遇到了不少这样的要求,有简单有复杂.最好的实现方案就是讲业务和UI隔离,封装成 ...
-
[Leetcode]-ReverseLinkedList
题目:单链表取反 #include <stdlib.h> #include <stdio.h> typedef struct node *list; typedef struc ...
-
Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)
Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...
-
Python数据分析--Pandas知识点(一)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘 1. 重复值的处理 利用drop_duplicates()函数删除数据表中重复多余的记录, 比如删除重复多余的ID. im ...