C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口...

本文主要是介绍C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发环境

操作系统:Windows Server 2008 R2

集成开发环境(IDE):Microsoft Visual Studio 2010

开发语言:c#

创建项目

文件》新建》项目


.NET Framework可以选择2.0版本,也可以选择4.0版本;

项目类型选择:Windows窗体应用程序

输入项目名称,确定


项目创建成功,如下图:


修改主窗体属性

修改窗体的“FormBorderStyle”属性为“none”,实现一个没有边框的窗体


修改后窗口设计器中显示如下:


依次按下图修改其它属性,属性值黑体加粗的是修改过的


属性说明:

ShowIcon=False,不显示窗体的图标;

ShowInTaskbar=False,使窗体不在Windows任务栏中出现;

SizeGripStyle=Hide,禁用拖动窗体右下角可以改变大小的功能;

WindowsState=Minimized,窗口启动后最小化;

设置完这些属性后,编译,运行,程序是在运行状态,但是却看不到程序的窗口;

实现热键功能

这里需要使用WindowsAPI

注册热键:RegisterHotKey

该函数定义一个系统范围的热键函数原型:BOOL RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk);

取消热键注册:UnregisterHotKey

该函数释放调用线程先前登记的热键。

获取热键ID:GlobalAddAtom

只适用于桌面应用程序。
向全局原子表添加一个字符串,并返回这个字符串的唯一标识符(原子ATOM)。
API及局部变量定义:

        /// <summary>/// 向全局原子表添加一个字符串,并返回这个字符串的唯一标识符(原子ATOM)。/// </summary>/// <param name="lpString">自己设定的一个字符串</param>/// <returns></returns>[System.Runtime.InteropServices.DllImport("Kernel32.dll")]public static extern Int32 GlobalAddAtom(string lpString);/// <summary>/// 注册热键/// </summary>/// <param name="hWnd"></param>/// <param name="id"></param>/// <param name="fsModifiers"></param>/// <param name="vk"></param>/// <returns></returns>[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);/// <summary>/// 取消热键注册/// </summary>/// <param name="hWnd"></param>/// <param name="id"></param>/// <returns></returns>[System.Runtime.InteropServices.DllImport("user32.dll")]public static extern bool UnregisterHotKey(IntPtr hWnd, int id);/// <summary>/// 热键ID/// </summary>public int hotKeyId = 100;/// <summary>/// 热键模式:0=Ctrl + Alt + A, 1=Ctrl + Shift + A/// </summary>public int HotKeyMode = 1;/// <summary>/// 控制键的类型/// </summary>public enum KeyModifiers : uint{None = 0,Alt = 1,Control = 2,Shift = 4,Windows = 8}/// <summary>/// 用于保存截取的整个屏幕的图片/// </summary>protected Bitmap screenImage;
注册热键:
        private void Form1_Load(object sender, EventArgs e){//隐藏窗口this.Hide();//注册快捷键//注:HotKeyId的合法取之范围是0x0000到0xBFFF之间,GlobalAddAtom函数得到的值在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。this.hotKeyId = GlobalAddAtom("Screenshot") - 0xC000;if (this.hotKeyId == 0){//如果获取失败,设定一个默认值;this.hotKeyId = 0xBFFE; }if (this.HotKeyMode == 0){RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Alt, Keys.A);}else{RegisterHotKey(Handle, hotKeyId, (uint)KeyModifiers.Control | (uint)KeyModifiers.Shift, Keys.A);}}
热键响应函数:

        /// <summary>/// 处理快捷键事件/// </summary>/// <param name="m"></param>protected override void WndProc(ref Message m){//if (m.Msg == 0x0014)//{//    return; // 禁掉清除背景消息//}const int WM_HOTKEY = 0x0312;switch (m.Msg){case WM_HOTKEY:ShowForm();break;default:break;}base.WndProc(ref m);}

截图窗口实现原理

截图窗口实际是一个没有边框,没有菜单,没有工具栏的一个全屏顶层窗口。

当按下热键时,程序首先获取整个屏幕的图片,保存到“screenImage”变量中;然后添加遮罩层,将其设置为窗体的背景图,将窗口大小设置为主屏幕的大小,显示窗口;让人感觉是在桌面上加一个半透明的遮罩层一样。

代码如下:

        /// <summary>/// 如果窗口为可见状态,则隐藏窗口;/// 否则则显示窗口/// </summary>protected void ShowForm(){if (this.Visible){this.Hide();}else{Bitmap bkImage = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);Graphics g = Graphics.FromImage(bkImage);g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size, CopyPixelOperation.SourceCopy);screenImage = (Bitmap)bkImage.Clone();g.FillRectangle(new SolidBrush(Color.FromArgb(64, Color.Gray)), Screen.PrimaryScreen.Bounds);this.BackgroundImage = bkImage;this.ShowInTaskbar = false;this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;this.Width = Screen.PrimaryScreen.Bounds.Width;this.Height = Screen.PrimaryScreen.Bounds.Height;this.Location = Screen.PrimaryScreen.Bounds.Location;this.WindowState = FormWindowState.Maximized;this.Show();}}

取消热键注册

关闭窗口时,要取消热键注册,代码如下:

        /// <summary>/// 当窗口正在关闭时进行验证/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_FormClosing(object sender, FormClosingEventArgs e){if (e.CloseReason == CloseReason.ApplicationExitCall){e.Cancel = false;UnregisterHotKey(this.Handle, hotKeyId);}else{this.Hide();e.Cancel = true;}}

到这里,热键注册,截图窗口的显示等功能已经基本完成。

注意:测试本代码时最好在窗体上添加一个按钮,用于关闭或隐藏截图窗口;因为截图窗口是全屏的,不能响应ESC键,所以只能通过任务管理器来结束进程退出。调试时最好是在窗体上添加一个Label控件来显示需要的变量信息,因为截图窗口是顶层的全屏窗口,断点被命中时根本没办法操作VS。

这篇关于C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846343

相关文章

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高