C#屏幕截图

简介: 原文:C#屏幕截图今天通过C#来实现一个简单的屏幕截图功能。实现思路,获取鼠标按下去的位置和鼠标左键释放的位置,计算这个区域的宽度和高度。然后通过 Graphics.CopyFromScreen 方法便可以获取到屏幕截图了。
原文: 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);
                }
            }
        }

运行效果:

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

目录
相关文章
|
C#
C#软件开发实例.私人订制自己的屏幕截图工具(十一)编辑工具栏的实现
本实例全部文章目录 (一)功能概览 (二)创建项目、注册热键、显示截图主窗口 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)添加配置管理功能 (七)添加放大镜的功能 (八)添加键盘操作截图的功能 (九)使用自定义光标,QQ截图时的光标 (十)在截图中包含鼠标指针形状 概述 截图之后,有时我们需要对其进行标注、修改等功能,这里就讲一下编辑工具栏的实现。
985 0
|
C#
【拥抱开源】十年之做C#屏幕截图工具全面开源
最初的项目名称是屏幕截图2005,因为这一年是2005年,也因为它是使用VS2005创建的。这十年来一直在使用和完善中,只是个人的精力有限,想做的东西太多,还没有把它做的特别的完善。之前写过 C#软件开发实例.私人订制自己的屏幕截图工具 系列文章,也附带了源码下载,是对部分功能实现改进后的实现,但实现的功能不如最初的版本完善。
1485 0
|
测试技术 C#
C#软件开发实例.私人订制自己的屏幕截图工具——放大镜的功能代码优化
最近在使用屏幕截图工具的时候发现放大镜的功能有点小问题,准星和实际鼠标位置对不上,取到的颜色并不鼠标所在的点颜色,所以去看“C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能”的代码,发现之前的代码实现效率上应该有问题,所以就试试优化了一下,经过对比相差十几倍。
1207 0
|
存储 C#
C#软件开发实例.私人订制自己的屏幕截图工具(一)功能概览
概述 开发该软件的原因主要是想订制实现自己想要的功能,比如:自动保存,气泡提示框类型的标注功(主要用于功能说明文档的写作)能。 托盘图标及菜单 添加托盘图标,是因为有些功能还是需要使用菜单呼出,不能什么都用快捷键。
730 0
|
C# Windows
C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口
开发环境 操作系统:Windows Server 2008 R2 集成开发环境(IDE):Microsoft Visual Studio 2010 开发语言:c# 创建项目 文件》新建》项目 .
774 0
|
C#
C#软件开发实例.私人订制自己的屏幕截图工具(三)托盘图标及菜单的实现
概述 添加托盘图标功能主要是为了添加菜单功能,可以通过托盘图标来管理程序;托盘菜单包括“打开保存目录、录制Flash动画、录制GIF动画、延时5秒截图、截图、设置、退出”等功能。 系统托盘 系统托盘是个特殊区域,通常在桌面的底部,在那里,用户可以随时访问正在运行中的那些程序。
1079 0
|
缓存 C#
C#软件开发实例.私人订制自己的屏幕截图工具(四)基本截图功能实现
实现原理 基本截图的功能主要靠响应主窗体的鼠标按下、鼠标移动、鼠标抬起几个事件的功能来实现的。截取的图片区域使用“Label”组件来显示,需要重新实现“Label”组件的“Paint”方法。 左键单击开始截图,右键单击取消截图,双击鼠标左键完成截图,将截取的图片保存到Windows剪贴板中。
643 0
|
C#
C#软件开发实例.私人订制自己的屏幕截图工具(五)针对拖拽时闪烁卡顿现象的优化
由于在实现的时候偷了个赖,没有使用主窗体的区域重绘技术,而是使用一个Label组件来展现截取的图片区域,所以在拖拽将截取区域变小或者是反向截图的时候,闪烁及卡顿的现象会比较严重,这里针对这两个问题对行一些针对性的优化。
721 0
|
存储 C#
C#软件开发实例.私人订制自己的屏幕截图工具(六)添加配置管理功能
上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(五)针对拖拽时闪烁卡顿现象的优化 添加设置窗口 在解决方案资源管理器窗口中,右键单击项目名称,在弹出的菜单中选择:添加》Windows窗体: 输入窗体名称“frmSetup”: 设置窗体的Text属性为“设置”,设置窗体的Size为“472, 276”,StartPosition属性为“CenterScreen”。
759 0