当前位置: 首页 > news >正文

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
暂时能够想到的快捷键设置方式只有这些,后面如果发现什么其他的方法会随时补充的。感兴趣的童鞋可以关注博客的更新。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue中v-bind和v-model的区别和应用
  • MySQL底层为什么选择用B+树作为索引
  • 实习项目|苍穹外卖|day9
  • 【C++ Primer Plus习题】16.2
  • Redis Sentinel(哨兵)详解
  • 3. 轴指令(omron 机器自动化控制器)——>MC_MoveAbsolute
  • 微信小程序点赞动画特效实现
  • k8s以及prometheus
  • 解读 Redis 底层密码:命令执行流程与高效性之源
  • 栈和队列的算法题目(C语言)
  • linux入门到实操-4 linux系统网络配置、连接测试、网络连接模式、修改静态IP、配置主机名
  • Linux基础---06压缩打包及解压rar压缩包
  • Rust 函数
  • 数据结构实验1
  • [创业之路-146] :如何理解:复杂的事情简单化,简单的事情标准化,标准的事情流程化,流程的事情数字化,数字化的事情自动化,自动化的事情智能化
  • Codepen 每日精选(2018-3-25)
  • Docker下部署自己的LNMP工作环境
  • ECMAScript6(0):ES6简明参考手册
  • GraphQL学习过程应该是这样的
  • java中具有继承关系的类及其对象初始化顺序
  • mysql 5.6 原生Online DDL解析
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python - 闭包Closure
  • Python 基础起步 (十) 什么叫函数?
  • Python利用正则抓取网页内容保存到本地
  • Rancher-k8s加速安装文档
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于Flux,Vuex,Redux的思考
  • 缓存与缓冲
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 简单基于spring的redis配置(单机和集群模式)
  • 前端面试题总结
  • 使用docker-compose进行多节点部署
  • 为视图添加丝滑的水波纹
  • 运行时添加log4j2的appender
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​​​​​​​​​​​​​​Γ函数
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #android不同版本废弃api,新api。
  • (7)STL算法之交换赋值
  • (笔记)M1使用hombrew安装qemu
  • (附源码)计算机毕业设计ssm电影分享网站
  • (十八)Flink CEP 详解
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (原創) 未来三学期想要修的课 (日記)
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net中调用windows performance记录性能信息
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @Autowired自动装配
  • @JoinTable会自动删除关联表的数据
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [C/C++入门][字符与ASCII码]6、用代码来转换字符与它的ASCII码
  • [Day 26] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • [docker] Docker容器服务更新与发现之consul