截图程序的代码参考了一个印度人的博客还有周银辉的博客, 这两位都是用WPF做的, 在截图的时候半透明遮罩都是用的WPF里的Canvas, 但WinForm里没有这个控件, 我想出了另一个办法.

大致思路是按截图按钮后, 打开另一个Form, 这个Form没有边框, 初始就是最大化占满整个屏幕, 背景色为白色, 透明度为50%. 这样就差不多是个半透明遮罩的效果了, 在任务栏显示图标这个属性也要设为false, 大概这样大家就明白我的意思了. 而在截取屏幕部分图像时, 这部分的半透明色彩要恢复成屏幕这部分的真面目, 所以我想了一个办法, 把这个窗口的TransParencyKey设为CornflowerBlue, 然后在屏幕上画CornflowerBlue这个颜色的矩形框, 这样就可以把这个框框部位的颜色变成屏幕的颜色了. 效果如下图:

那个矩形框是这样绘制出来的:

private void Form2_MouseDown(object sender, MouseEventArgs e)
{x = MousePosition.X;y = MousePosition.Y;isMouthDown = true;
}private void Form2_MouseMove(object sender, MouseEventArgs e)
{if (isMouthDown){width = Math.Abs(MousePosition.X - x);height = Math.Abs(MousePosition.Y - y);g = CreateGraphics();g.Clear(BackColor);g.FillRectangle(Brushes.CornflowerBlue, x<MousePosition.X?x:MousePosition.X, y<MousePosition.Y?y:MousePosition.Y, width + 1, height + 1);}
}private void Form2_MouseUp(object sender, MouseEventArgs e)
{nowX = MousePosition.X + 1;nowY = MousePosition.Y + 1;this.Close();formMain.pcurrentWin.Snap(x < nowX ? x : nowX, y < nowY ? y : nowY, Math.Abs(nowX - x), Math.Abs(nowY - y));//开始截图formMain.pcurrentWin.Show();
}

周博客里提到的用这样的绘图方式在单显示器里效果还行, 双显示器里有明显的滞后感...我没有双显示器的环境, 希望有心人帮我测试一下在双显示器里画这个框框有没有滞后感. 但实际上在我电脑上运行的时候, 当鼠标移动重绘这个矩形时, 尽管没有所谓的滞后感, 但还是比较耗CPU的. 不知道Windows7桌面上的半透明蓝色矩形框是用什么技巧画出来的?

另外我发现了这两个人写的CopyFromScreen貌似写的都有一点问题, 比如周是这样写的:

g.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy);

我后来也是传进这几个参数的, 但发现截全屏的时候, 比如我的显示器是1280*800, 截到的却总是1279*799这么大, 并且如果在屏幕的左上角(0, 0)单击一下, 却是截取的整个屏幕! 所以我后来把这个矩形的长宽都加上了1, 于是正常了...但尚不清楚这是为何(特别是单击左上角接触整个屏幕这个情况).

程序界面(部分功能还未写):

程序下载: ScreenSnap.zip

代码下载: ScreenSnapCode.zip

WinForm下屏幕截图程序的实现相关推荐

  1. 刚刚做完的一个屏幕截图程序,分享一下

    刚刚做完的一个屏幕截图程序,分享一下 周银辉 好长时间没有更新博客了啊,把绝大多数时间花在了那个开源的WPFToolkit 和 <深入理解操作系统>上, 然后见缝插针地做了这个截图程序. ...

  2. Winform下的地图开发控件(GMap.NET)使用心得之二

    在上篇<Winform下的地图开发控件(GMap.NET)使用心得>中简单介绍了GMap.NET的控件基本情况,本篇开始介绍一下相关的代码操作. 其实目前GMap.NET提供的功能还不是很 ...

  3. java messagebox 关闭_wince/WinForm下实现一个自动关闭的MessageBox

    WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作.在有些应用中我们需要通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭.然而.Net ...

  4. winform下的未捕捉的异常处理

    winform下可以有两种方式来处理未捕捉的异常: 1.通过挂接Application.ThreadException 事件来处理未捕捉的异常. 2.通过挂接AppDomain.UnhandledEx ...

  5. WinForm下DataGridView导出Excel的实现

    WinForm下DataGridView导出Excel的实现   1.说明:导出的效率说不上很高,但至少是可以接收的.参考网上很多高效导出Excel的方法,实现到时能够实现的,导出速度也很快,不过缺陷 ...

  6. WinForm 下实现一个自动关闭的MessageBox

    WinForm 下实现一个自动关闭的MessageBox Author: eaglet WinForm 下我们可以调用MessageBox.Show 来显示一个消息对话框,提示用户确认等操作.在有些应 ...

  7. C#下Winform下使用WebKit、Geckofx、CefSharp对比及CefSharp代码实现

    C#Winform下使用WebKit.Geckofx.CefSharp对比及CefSharp代码实现 一.使用visual studio 2021自带的NuGet程序包管理器安装CefSharp 二. ...

  8. cef异常处理_cefSharp在XP下使得程序崩溃记录

    前言:这是一个奇葩的问题,到现在自己还没有搞明白问题出现在哪里,但是从问题总算是解决了,希望看到此文章的大牛,如果知道问题出在什么地方,可以告知一下. [一个在XP系统下面应用程序崩溃问题] 资源: ...

  9. Winform 自动升级程序

    抽时间整理下升级这块的功能,并封装一个升级工具包. 作为winform 程序员都有一个C/S端程序绕不过的问题.那就是如何升级程序? 程序升级两种1.启动时强制更新 2.自动.手动获取更新,并确认是否 ...

最新文章

  1. java 音乐api接口_关于网易云音乐爬虫的api接口?
  2. php团队规范,简单的PHP团队编程规范与习惯
  3. openwrt监控linux,OpenWRT上判断客户端在线个数
  4. FATFS里的FILINFO结构体详解
  5. 计算机网络知识点2——数据交换、码分多路复用
  6. 安装和配置SQL Server 2016 With SP1
  7. Mealy状态机的一点理解
  8. python+selenium十:selenium的二次封装
  9. 多个excel文件内容合并到一个excel文件的多个sheet的小程序
  10. Java 文件高效写入方法
  11. Go 程序是如何编译成目标机器码的
  12. 【QT】一份值得学习的QT视频教程
  13. unas 下 Transmission 下载使用体会
  14. 【CISCO】链路聚合基础命令详解。
  15. Django项目实战——11—(文件存储方案FastDFS、容器化方案Docker)
  16. Vue学习(学习打卡Day13)
  17. 所在位置 行:1 字符: 1+ cnpm i+ ~~~~ + CategoryInfo : SecurityError: (:) [],PSSecurityExcepti
  18. H12-723题库-个人整理笔记
  19. 仿比心源码,uniApp自适应手机屏幕高度
  20. netstat -ano 查看端口是否被占用

热门文章

  1. python计算分段函数_Python练习题2.2计算分段函数
  2. java爬虫代码示例_那些让你代码思维和能力有较大的提升Java源码
  3. SSL 自签证书工具源码
  4. 在html中用表单插入servlet 怎么写servlet的地址,java web中servlet、jsp、html 互相访问的路径问题。...
  5. webstorm配置,快捷键console.log,中文字体,快捷键配置等
  6. 设置XMLHttpRequest“ withCredentials”属性问题,axios请求不成功
  7. ollyice的学习
  8. QQ连连看棋盘数组找法:
  9. Node.js: 如何退出node命令或者node server
  10. 12 个非常有用的 JavaScript 技巧