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#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的