采用WPF开发截图程序,so easy!

原文:采用WPF开发截图程序,so easy!

前言  QQ、微信截图功能已很强大了,似乎没必要在开发一个截图程序了。但是有时QQ热键就是被占用,不能快速的开启截屏;有时,天天挂着QQ,领导也不乐意。既然是程序员,就要自己开发截屏工具,功能随心所欲,岂不快哉。

再强调一点:工具就是生产力!没有掌握WPF之前,我是不会开发这么一个程序的,如果采用MFC、winform框架,工作量是相当的大,开发出来的效果肯定也比较low。本人用WPF,花了一天的功夫,开发了这个小程序。程序的定位就功能简单,平时工作不碍事,用着的时候,一键截图!

 界面  执行程序下载 一键截图

程序就一个按钮,点击开始截屏,就是这么简单。看似简单,对开发技巧要求很高。内行看门道!

开发思路

  常言道:看到的不一定是真实的。开发也要这样。程序叫截屏,你不要一股劲想着怎么截取别的窗口图案,肯定很费劲!思虑就是掩人耳目:先将整个屏幕复制,放到自己程序窗体中,窗体最大化,覆盖整个屏幕!用户看到还是整个屏幕,但是整个屏幕已被偷梁换柱!此后,你所有的操作都是在自己窗体上处理,当然可以随心所欲了!

截取整个屏幕

       public Bitmap GetScreenSnapshot()
        {
            System.Drawing.Rectangle rc = SystemInformation.VirtualScreen;
            var bitmap = new Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            using (Graphics memoryGrahics = Graphics.FromImage(bitmap))
            {
                memoryGrahics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy);
            }

            return bitmap;
        }

创建全屏窗体

注意窗体属性,这样才能全面覆盖整个屏幕。

图层布局

这个很有技巧!为了实现非截图区域阴影效果,费了一番心机!即使这样,感觉也比winform用起来得心应手!

注:我不是一直贬低winform,但是要承认,这两个东西不是一个时代产物。wpf设计思路比winform先进很多。只是wpf新概念多,用的人少,开发起来常常蒙圈!经过一段迷茫期,前途就会光明了!

窗口的布局,不多说了!直接上代码。我对代码做了注释!

    <Grid>
        <!-- 整个屏幕图像 -->
        <Image x:Name="imgScreen"
               MouseDown="ImgScreen_MouseDown"
               MouseUp="ImgScreen_MouseUp"
               Stretch="None"
               MouseMove="ImgScreen_MouseMove">
        </Image>

        <!-- 覆盖一层黑色,半透明状 -->
        <Grid x:Name="gridCover" Visibility="Collapsed" Background="Black" Opacity="0.5">
        </Grid>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="auto"></RowDefinition>
            </Grid.RowDefinitions>
            <!-- 前面覆盖了一层黑色,但是截取的图像不能覆盖,只能在这里再显示截取图像 -->
            <Image x:Name="imgCut" Grid.RowSpan="3" Stretch="None"
                   HorizontalAlignment="Left" VerticalAlignment="Top"></Image>
            <!--显示提示信息-->
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
                           FontSize="22" Foreground="Yellow"
                          Opacity="0.8" >滑动鼠标开始截屏 按ESC键退出</TextBlock>

            <StackPanel  Grid.RowSpan="3">
                <!--截图指示框-->
                <Border x:Name="borderSelect"
                HorizontalAlignment="Left" VerticalAlignment="Top"
                BorderThickness="1" BorderBrush="Red"></Border>
                <!--宽和高指示-->
                <StackPanel Orientation="Horizontal">
                    <TextBlock x:Name="txtCutInfo" Background="Black" Padding="3"
                               HorizontalAlignment="Left"
                               Foreground="White"></TextBlock>
                </StackPanel>

            </StackPanel>

        </Grid>
    </Grid>

当鼠标移动时,不断的计算选中区域,设置borderSelect属性。

 private void ImgScreen_MouseMove(object sender, MouseEventArgs e)
        {
            if (!_isMouseDown)
                return;

            gridCover.Visibility = Visibility.Visible;

            //计算鼠标选中区域
            Point currentPoint = e.GetPosition(imgScreen);
            Point borderPoint = e.GetPosition(borderSelect);

            double xDelta = xDelta_BoderToImgScreen;
            double yDelta = yDelta_BoderToImgScreen;

            _rectImgCut = ImageHelper.ToRect(currentPoint, _startPoint);

            Rect rectBoderCut = ImageHelper.ToRect(new Point(currentPoint.X + xDelta, currentPoint.Y + yDelta),
                new Point(_startPoint.X + xDelta, _startPoint.Y + yDelta));

            //设置方框位置和大小
            Thickness thickness = new Thickness(rectBoderCut.Left, rectBoderCut.Top, 0, 0);
            borderSelect.SetValue(FrameworkElement.MarginProperty, thickness);
            imgCut.SetValue(FrameworkElement.MarginProperty, thickness);

            thickness = new Thickness(rectBoderCut.Left, 3, 0, 0);
            txtCutInfo.SetValue(FrameworkElement.MarginProperty, thickness);

            borderSelect.Width = Math.Abs(_startPoint.X - currentPoint.X);
            borderSelect.Height = Math.Abs(_startPoint.Y - currentPoint.Y);
            borderSelect.Visibility = Visibility.Visible;

            //为了防止整个图 变暗,鼠标选中区域图像抠图,再在上层图像上显示
            imgCut.Source = GetBitmapCut();

            Int32Rect imgDestRect = GetCutRect();
            txtCutInfo.Text = string.Format($"宽:{imgDestRect.Width} 高:{imgDestRect.Height}");
        }

到此,程序主要逻辑处理完毕!麻雀虽小五脏俱全!这里用到不少wpf布局技巧。这些技巧与winform处理思虑差别还是很大的!wpf虽然苦涩难懂,感觉一入候门深似海!如果坚持下来,就会感到豁然开朗,也理解了微软的一片苦心!

程序运行效果与QQ截图很类似了。顺着这个思虑往前走,完全可以开发出与QQ截图一样的效果!

原文地址:https://www.cnblogs.com/lonelyxmas/p/11707232.html

时间: 2024-10-29 22:58:42

采用WPF开发截图程序,so easy!的相关文章

OFD电子证照模版制作工具 --(采用wpf开发)

前言  ofd应用的范围非常广,电子证照是其中非常重要的一个应用.同一类电子证照具有相同的板式.元数据:所以电子证照非常适合用模版来制作.模版就是板式样式固定,每个具体的证照只是文字或图片内容不同.比如结婚证,包含持证人.登记日期等,这些元素在界面的位置是固定的.作者设计了一款软件,可以方便的编辑这类模版,根据模版再生成电子证照,采用这种方式可以快速开发各类电子证照. 程序界面  设计思路 数据分为两种类型:文字和图片.对于文字,可以移动位置.设置字体.字号等.对于图片,可以移动位置.缩放等.板

pdf文件内容查看器 -- 采用wpf开发

前言 pdf是一种应用非常广的版式文档格式,已成为事实上的国际标准.关于pdf格式的文章汗牛充栋,本文也是关于pdf格式的文章,但是本文不是纸上谈兵:本人这几周一直研究pdf格式内容,不但对pfd格式的内容有所了解,同时也写了一款软件,可以方便查看pdf文件内容.使用该软件,同时结合pdf相关文章,可以很快掌握pdf格式内容. 软件截图:软件下载地址 点我下载 pdf文件内容简要介绍 这里对pdf文件格式做个粗略介绍,只有了解了这些内容,才能知道如何使用该软件. pdf文档总结构如下: 1)he

OFD电子文档阅读器功能说明(采用WPF开发,永久免费)

特别说明 ofd阅读器开发语言为c#,具有完全自主产权,没有使用第三方ofd开发包.可以根据你的需求快速定制开发.本阅读器还在开发完善阶段,如有任何问题,可以联系我QQ:13712486.博客:https://www.cnblogs.com/yuanchenhui/ 软件下载地址:ofd阅读器(全新开发,永久免费).zip 1 主界面 2 文件信息指示:    无电子印章和签名                       有电子印章和签名     文本属性:指示是否包含 电子印章.签名.如果包含

WPF 开发自动开机启动程序

原文:WPF 开发自动开机启动程序 本文告诉大家如何在 WPF 开发一个可以自动启动的程序 本文使用的自动开机启动方法是通过快捷方式放在启动文件夹的方式. 创建快捷方式 /// <summary> /// 为本程序创建一个快捷方式. /// </summary> /// <param name="lnkFilePath">快捷方式的完全限定路径.</param> /// <param name="args">

WPF触控程序开发(三)——类似IPhone相册的反弹效果

用过IPhone的都知道,IPhone相册里,当图片放大到一定程度后,手指一放,会自动缩回,移动图片超出边框后手指一放,图片也会自动缩回,整个过程非常和谐.自然.精确,那么WPF能否做到呢,答案是肯定的. 在没有现成的控件的情况下,只有自己做,你肯定想到做动画,WPF触屏开发提供了相应的功能来获取触控点的一些变化,这些变化的最佳消费者个人认为是Matrix.我们回想下做动画一般怎么做,比如给一个button做个宽度增5的动画,我们一般是定义一个DoubleAnimation,然后定义一个Sotr

系统启动时自动运行开发的程序,采用计划任务

系统启动时自动运行开发的程序,采用计划任务. 如果通过设置注册表来实现的,发现如果用户没有登陆桌面,就不能自动运行. 所以采用计划任务,即使用用户不登陆,只要电脑开机或重启后,都能在后台运行开发的程序.

在VS2008.Net下使用WPF开发Web应用程序

原文地址:http://hankjin.blog.163.com/blog/static/33731937200922353623434/ 胖客户端的好处是可以轻易的实现绚丽的效果, 而瘦客户端则需要大量的js才能实现相应的效果. 而且当需要同时开发应用程序和Web应用程序时, 则需要将近双倍的开发时间.但是,在VS2008.Net下使用WPF技术, 则不但可以轻松地在Web上实现应用程序的效果, 而且可以很简单的将应用程序转换成Web应用程序.1. 新建->项目->WPF Web Appli

采用WPF技术,开发OFD电子文档阅读器

前言 OFD是国家标准版式文档格式,于2016年生效.OFD文档国家标准参见<电子文件存储与交换格式版式文档>.既然是国家标准,OFD随后肯定会首先在政务系统使用,并逐步推向社会各个方面.OFD是在研究当下各类文件格式后,推出的标准,有如下优点: 1 产权属于自主产权 2 具有便携性:文件小,可压缩比率大.测试显示生成的文件体量比PDF还要小. 3 具有开放性:易于入门,对于使用者来说更具开放性. 4 具有扩展性:预留了可扩展入口和自定义标引,设置了非接触式引用机制,为特性化提供支持. 5 呈

拥抱新的.Net开发框架,WPF开发人员怎样向.Net迁移

ArcGIS Runtime 10.2版本号中.将WindowsPhone .WindowsStore以及WPF三大SDK整合成了一个全新的SDK--ArcGISRuntime SDK for Microsoft .Net Framework,简称.Net SDK.同一时候现有的WPF SDK能够继续使用.但兴许会停止更新.因此,Esri建议WPF开发人员们向.Net阵营迁移. 顾名思义,新的.NetSDK面向微软的.Net框架,曾经的WPF.Windows Phone以及Windows Sto