c#中给winform定义快捷键的几种方式

快捷键的使用在日常的开发中频率比较高,这里总结了最常见的各种快捷键的设置方式,需要的时候大家直接照抄就可以了,不用再去查询如何实现了。

文章目录

  • 一、按钮快捷键
  • 二、菜单快捷键
  • 三、全局快捷键
    • 1、重写ProcessCmdKey
    • 2、使用KeyPreview属性捕捉快捷键
      • a.创建一个快捷键管理器类:
      • b、在窗体中使用快捷键管理器:
    • 4、用API实现
      • a、添加必要的Windows API声明:
      • b、在窗体中使用快捷键管理器:

文章原出处: https://haigear.blog.csdn.net/article/details/142202370

一、按钮快捷键

1、直接通过按钮Text定义
这个方法直接从VB沿用至今,在按钮的Text属性中使用“&+字母“即可设置,设置完成后,button的文字中就会出现一个有下划线的字母,这个就是ALT+字母的组合快键键了
在这里插入图片描述

2、通过AccessKey属性设置

对于某些控件(如按钮),虽然不能直接设置快捷键,但可以通过AccessKey属性为控件设置访问键,当控件具有焦点时,按下Alt键加上访问键字符即可触发。

// 为按钮设置访问键 'S'
button.AccessKey = 'S';

当然,这个方法不仅适合给button控件,其他的控件也是可以的。

二、菜单快捷键

使用Keys枚举和ModifierKeys枚举定义快捷键组合:
你可以通过设置控件的ShortcutKeys属性来定义快捷键。这通常用于MenuItem控件,但也可以用于其他控件。例如,为菜单项设置快捷键

  ToolStripMenuItem1.ShortcutKeys= Keys.Delete;

如果要设置组合快捷键,则可以这么来设置:

// 设置菜单项的快捷键为 Ctrl + S
menuItem.ShortcutKeys = Keys.Control | Keys.S;
menuItem.ShortcutKeysEnabled = true;

文章原出处:https://haigear.blog.csdn.net/article/details/142202370

三、全局快捷键

1、重写ProcessCmdKey

如果你想捕捉窗体中的快捷键,可以在窗体类中重写ProcessCmdKey方法。这允许你定义全局快捷键,即使焦点不在特定控件上也能响应。

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData){if (keyData == (Keys.Alt | Keys.V)) // ALT + V{// 执行保存操作MessageBox.Show("alt+V");return true; // 表示快捷键已被处理}return base.ProcessCmdKey(ref msg, keyData); // 其他快捷键传递给基类处理}

2、使用KeyPreview属性捕捉快捷键

将窗体的KeyPreview属性设置为true,这样窗体就可以在控件之前接收到键盘事件。然后,你可以通过KeyDown或KeyUp事件来处理快捷键。

public Form1()
{InitializeComponent();this.KeyPreview = true;
}private void Form1_KeyDown(object sender, KeyEventArgs e)
{if (e.Control && e.KeyCode == Keys.S){// 执行保存操作yourFunction();e.Handled = true; // 表示快捷键已被处理}
}

3、使用WPF的快捷键定义法
在 WinForms 中,InputBindings 并不是直接支持的,这是 WPF (Windows Presentation Foundation) 中的一个特性。在 WinForms 中,我们通常使用其他方法来实现快捷键的功能,如之前提到的 ProcessCmdKey 方法、KeyPreview 属性以及菜单项的 ShortcutKeys 属性。

如果你希望在 WinForms 中实现类似 WPF 的 InputBindings 功能,你需要手动实现一些逻辑。以下是一个简单的示例,说明如何模拟 InputBindings 的行为
文章原出处:https://haigear.blog.csdn.net/article/details/142202370

a.创建一个快捷键管理器类:

创建一个类来存储快捷键和对应的命令或事件处理器。

using System;
using System.Collections.Generic;
using System.Windows.Forms;public class ShortcutManager
{private Dictionary<Keys, Action> _shortcuts = new Dictionary<Keys, Action>();public ShortcutManager(Form form){form.KeyPreview = true;form.KeyDown += Form_KeyDown;}private void Form_KeyDown(object sender, KeyEventArgs e){if (_shortcuts.ContainsKey(e.KeyCode)){_shortcuts[e.KeyCode]();e.Handled = true;}}public void AddBinding(Keys key, Action action){_shortcuts[key] = action;}
}

b、在窗体中使用快捷键管理器:

在窗体的构造函数中初始化快捷键管理器,并添加快捷键。

public partial class MainForm : Form
{public MainForm(){InitializeComponent();var shortcutManager = new ShortcutManager(this);// 添加快捷键 Ctrl+S 来触发保存操作shortcutManager.AddBinding(Keys.Control | Keys.S, SaveFile);}private void SaveFile(){// 实现保存文件的逻辑}
}

说明:
这里,ShortcutManager 类负责监听窗体的按键事件,并根据按键执行相应的动作。你可以通过调用 AddBinding 方法来添加快捷键和对应的处理函数。

一定要注意,这种方法需要你手动管理快捷键的添加和事件处理,而 WPF 中的 InputBindings 是通过 XAML 和绑定机制来实现的,WinForms 并没有直接提供这样的支持。上述方法是模拟 WPF 功能的一种方式,但需要更多的代码来实现类似的功能。
文章原出处:https://haigear.blog.csdn.net/article/details/142202370

4、用API实现

这个是为老的c++老手准备的,也许在VC中习惯了这种方式,这里也给出实现的典型代码。
在C# WinForms中使用Windows API来实现快捷键,可以通过调用RegisterHotKey和UnregisterHotKey函数来注册和注销全局快捷键。这种方法允许你捕捉到即使应用程序不在前台运行时的快捷键操作。以下是如何实现的步骤:

a、添加必要的Windows API声明:

首先,需要在你的WinForms项目中添加对Windows API的引用。这可以通过在代码文件顶部添加DllImport属性来实现。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;public class HotkeyManager
{// 定义Windows API函数[DllImport("user32.dll")]public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);[DllImport("user32.dll")]public static extern bool UnregisterHotKey(IntPtr hWnd, int id);// 定义快捷键修饰符public const uint MOD_ALT = 0x0001;public const uint MOD_CONTROL = 0x0002;public const uint MOD_NOREPEAT = 0x4000;public const uint MOD_SHIFT = 0x0004;public const uint MOD_WIN = 0x0008;// 定义一个ID,用于标识快捷键private const int HOTKEY_ID = 9000;private IntPtr hWnd;public HotkeyManager(IntPtr hWnd){this.hWnd = hWnd;}// 注册快捷键public bool RegisterHotKey(Keys key, uint modifiers){return RegisterHotKey(this.hWnd, HOTKEY_ID, modifiers, (uint)key);}// 注销快捷键public void UnregisterHotKey(){UnregisterHotKey(this.hWnd, HOTKEY_ID);}
}

b、在窗体中使用快捷键管理器:

在你的窗体类中,创建HotkeyManager的实例,并在窗体加载时注册快捷键,在窗体关闭时注销快捷键。

public partial class MainForm : Form
{private HotkeyManager hotkeyManager;public MainForm(){InitializeComponent();hotkeyManager = new HotkeyManager(Handle);}protected override void OnLoad(EventArgs e){base.OnLoad(e);// 注册快捷键 Ctrl + Alt + ShotkeyManager.RegisterHotKey(Keys.S, HotkeyManager.MOD_ALT | HotkeyManager.MOD_CONTROL);}protected override void OnFormClosing(FormClosingEventArgs e){base.OnFormClosing(e);// 注销快捷键hotkeyManager.UnregisterHotKey();}// 快捷键响应事件protected override bool ProcessCmdKey(ref Message msg, Keys keyData){if (keyData == (Keys.Control | Keys.Alt | Keys.S)){// 执行快捷键对应的操作MessageBox.Show("快捷键 Ctrl + Alt + S 被触发");return true;}return base.ProcessCmdKey(ref msg, keyData);}
}

在这个示例中,当用户按下Ctrl + Alt + S时,会触发ProcessCmdKey方法,并显示一个消息框。请确保在窗体加载时注册快捷键,并在窗体关闭时注销快捷键,以避免潜在的资源泄漏。

使用Windows API来实现全局快捷键是一种强大的方式,但需要确保正确处理资源和线程问题,特别是在涉及多线程应用程序时。这种方法允许应用程序即使在后台运行时也能响应快捷键。
文章原出处:https://haigear.blog.csdn.net/article/details/142202370
暂时能够想到的快捷键设置方式只有这些,后面如果发现什么其他的方法会随时补充的。感兴趣的童鞋可以关注博客的更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534070.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统的重点笔记-1

一、操作系统的设计目标 1.易用性 使计算机易于使用&#xff0c;提供文件抽象后&#xff0c;对文件的操作就是对磁盘的操作&#xff0c;不再需要考虑如何通过控制磁盘移动&#xff0c;实现对磁盘某个信号的读写细节 2.高效性 完成特定功能的效率&#xff0c;如时间效率&…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…

Win11 频繁蓝屏重启

一、问题描述 最近在使用笔记本的时候时不时的蓝屏重启&#xff0c;甚至重启完进系统立马蓝屏重启&#xff0c;还好我凭借快速的手速拍到了错误的原因&#xff0c;如下图所示。 失败的操作是Netwtw12.sys&#xff0c;查了一下这个错误是由于无线网卡导致的&#xff0c;经过测试…

全网最适合入门的面向对象编程教程:48 Python函数方法与接口-位置参数、默认参数、可变参数和关键字参数

全网最适合入门的面向对象编程教程&#xff1a;48 Python 函数方法与接口-位置参数、默认参数、可变参数和关键字参数 摘要&#xff1a; 在 Python 中&#xff0c;函数可以接受多种不同类型的参数&#xff0c;包括位置参数、默认参数、可变参数和关键字参数等&#xff0c;理解…

什么是交换机级联?

在现代计算机网络中&#xff0c;交换机级联是一种广泛应用的技术&#xff0c;有助于提升网络的扩展性和灵活性。本文将深入探讨交换机级联相关知识&#xff0c;详细介绍其基本概念和连接配置方法&#xff0c;并对常见技术问题进行解答。 交换机级联概述 交换机级联是指通过将…

聊点基础的,关于监控,关于告警(prometheus—+grafana+夜莺如何丝滑使用?)

事情的起因是这样的&#xff0c;昨天又群友在群里咨询一个关于grafana和prometheus配置文件的用法&#xff0c;整了半天也没回复&#xff0c;正好知道就帮了一把&#xff0c;今天整理成文章&#xff0c;希望帮到更多的朋友 大致问题的话就是图里面提到的几个&#xff0c;其实都…

webpack的热更新原理

Webpack热更新&#xff08; Hot Module Replacement&#xff0c;简称 HMR&#xff09;&#xff0c;无需完全刷新整个页面的同时&#xff0c;更新所有类型的模块&#xff0c;是 Webpack 提供的最有用的功能之一。 保留在完全重新加载页面期间丢失的应用程序状态。只更新变更内容…

Qt_控件的QWidget属性介绍

目录 1、QWidget的核心属性 2、enabled 3、geometry 3.1 代码测试geometry 4、windowTitle 4.1 代码测试windowTitle 5、windowIcon 5.1 QIcon设置图标 5.2 qrc机制 5.3 代码测试windowIcon 6、windowOpacity 6.1 代码测试windowOpacity 7、cursor 7.1 代码测试…

多线程篇(线程池 - 整体介绍)(持续更新迭代)

目录 一、线程池&#xff08;并发编程的艺术&#xff09; 1. Java中的线程池 1.1. 线程池的实现原理 1.2 线程池的使用 1. 线程池的创建 2. 向线程池提交任务 3. 关闭线程池 4. 合理地配置线程池 5. 线程池的监控 1.3 本章小结 2. Executor框架 2.1 Executor框架简介…

2-93 基于matlab的无人机FMCW(频率调制连续波)毫米波高度计雷达仿真

基于matlab的无人机FMCW&#xff08;频率调制连续波&#xff09;毫米波高度计雷达仿真&#xff0c;不考虑环境杂波和收发信号隔离泄漏。通过考虑雷达天线、波束形成、信号传播、回波接收等环节影响。建立FMCW毫米波雷达系统的数学模型&#xff0c;评估无人机在不同高度下的高度…

Google推出Data Commons解决AI“幻觉”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

LeetCode 热题 100 回顾12

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

PCL 点云基于曲率大小渲染颜色

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概…

突破行业边界,构建可持续未来:2024生态系统架构创新与开放标准赋能全球业务增长

在全球数字化浪潮的推动下&#xff0c;企业面临着前所未有的机遇与挑战。如何在动态市场中实现跨行业的合作、确保业务的连续性并推动可持续发展&#xff0c;成为了每个企业高管和技术领导者亟待解决的关键问题。生态系统架构与开放标准的结合&#xff0c;不仅能够打破传统行业…

力扣刷题--73. 矩阵置零【中等】

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 算法分析 标签&#xff1a;标记数组 额外定义一个标记二维数组&#xff0c;用于存储matrix0存储的位置在哪里&#xff0c;如果是matrix…

Qt与Udp

(1)绑定端口 (2)广播 用udp实现广播通信_udp广播-CSDN博客 数据的发送是面向整个子网的&#xff0c;任何一台在子网中的计算机都可以接收到相同的数据。 如果一台机器希望向其他N台机器发送信息&#xff0c;这时候可以使用UDP的广播。 --------------- 广播地址&#xff1…

Apollo(阿波罗)架构由浅入深剖析

1.最简架构 如果不考虑分布式微服务架构中的服务发现问题,Apollo 的最简架构如下图所示: 注意事项: ConfigService 是一个独立的微服务,服务于 Client 进行配置获取。 Client 和 ConfigService 保持长连接,通过一种拖拉结合 (push & pull) 的模式,实现配置实时更新…

【OpenAPI】Spring3 集成 OpenAPI 生成接口文档

Spring3 集成 OpenAPI 生成接口文档 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 OpenAPI 依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --> <dependency><groupI…

【GBase 8c V5_3.0.0 分布式数据库常用几个SQL】

1.检查应用连接数 以管理员用户 gbase&#xff0c;登录数据库主节点。 接数据库&#xff0c;并执行如下 SQL 语句查看连接数。 SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;2.查看空闲连接 查看空闲(state 字段为”idle”)且长时间没有更…

Linux 磁盘信息查看命令及应用

Linux 磁盘信息查看命令及应用 本文介绍了几种常用的Linux命令&#xff0c;用于查看和管理磁盘信息。包括 lsblk 列出所有可用块设备的详细信息&#xff0c;df -h 和 df -Th 用于检查已挂载磁盘的容量和文件系统类型&#xff0c;以及 fdisk -l 查看硬盘的分区类型。此外&#…