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 = 1; 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, 0, 0, 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); } } }
运行效果:
源代码可以点击这里下载。
如果你有其他方式实现,欢迎与我分享。如果对代码有疑问,可以在评论中指出。感谢阅读。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
我和 Spring 大神的一天
先介绍一下故事的5位主人公。 Josh Long 龙之春:Spring 技术布道师,撰写过5部著作,录制过3部畅销的培训视频,是一位开源软件贡献者。 Spencer Gibb:Spring 技术布道师,Spring Cloud核心项目的联合创始人。除了深厚的Java开发经验,他在Scala和Python等其他语言的使用上也颇有建树。 亦盏:Spring Cloud Alibaba 项目组成员。 洛夜:Spring Cloud Alibaba 项目组成员。 小马哥:Java劝退师,Apache Dubbo PPMC,Spring Cloud Alibaba 项目组成员。 场景一:会场 1、参会日常 SpringOne Tour在国内开发者的受欢迎程度还是挺高的,500人的会场基本都坐满了,而且还遇到了不少熟人。大家寒暄一声,握个手,合个影,发个朋
- 下一篇
C# 实现单实例程序
原文: C# 实现单实例程序 在我们经常使用的软件中,当我们已经打开后,再次打开时,有的软件不会出现两个。例如有道词典,会将上次的界面显示出来,或者提示我们“该程序已经运行...”。我通过一个简单的C# WPF例子来说明。 首先我们要了解一下线程中的互斥体(Mutex),引用MSDN官方文档解释,这是一个同步基元,可以用于进程间同步。请参考下面的代码: public App() { bool isNewInstance; string appName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; Mutex mtx = new Mutex(true, appName, out isNewInstance); if (!isNewInstance) { MessageBox.Show("The app is running now."); Application.Current.Shutdown(); } } 这样就可以实现一个单实例程序。当该程序已经运行一次之后,再运行时会提示我们“The app...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果