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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Word使用手册

修改样式 编辑word文档时&#xff0c;标题和正文文本通常有不同的格式&#xff0c;如果能将这些格式保存为样式&#xff0c;下一次就能直接调用样式&#xff0c;而不需要重复手动设置格式。 可以将样式通常保存为不同的 样式模板.docx&#xff0c;要调用不同样式集&#xff0…

MATLAB基础应用精讲-【数模应用】卡方拟合优度检验(附MATLAB、python和R语言代码实现)

目录 前言 几个高频面试题目 卡方分布与拟合优度的卡方检验是什么关系? 算法原理 什么是卡方检验 卡方是什么? 如何使用卡方表计算器? 什么是卡方拟合优度检验 使用条件 基本原理 数学模型 卡方检验自由度 理论频数计算 需要注意的事项 卡方检验分类 1、 独…

校园管理系统创新:Spring Boot框架应用案例

第4章 系统设计 4.1 系统体系结构 校园管理系统的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 校园管理系统结构图&#xff0c;如图4-3所示。 图4-3 校园管理系统结构图 4.2开发流程设计 系统流程的分…

走进低代码表单开发(一):可视化表单数据源设计

在前文&#xff0c;我们已对勤研低代码平台的报表功能做了详细介绍。接下来&#xff0c;让我们深入探究低代码开发中最为常用的表单设计功能。一个完整的应用是由众多表单组合而成的&#xff0c;所以高效的表单设计在开发过程中起着至关重要的作用。让我们一同了解勤研低代码开…

网络安全要点总结

1. 入侵检测与防御: 1)入侵检测与系统IDS(intrusion detection system):防火墙之后的第二道闸门; IDS的部署:采用镜像端口或者集线器方式;部署在:服务器交换机上,internet接入路由器后面的第一台交换机上; IRSintrusion response system入侵响应系统: 2).IPS(…

如何进行大模型训练和微调?(实战)

1、在项目中&#xff0c;如果prompt和function calling足够好&#xff0c;尽量不要微调&#xff0c;节约成本。 以下是针对function calling的slot&#xff0c;评估准确率&#xff08;识别准确度&#xff09;、召回率&#xff08;全面率&#xff09;&#xff0c;F1值。 从中可以…

华为初级认证HCIA怎么样?

想在网络技术领域实现职业突破吗&#xff1f;华为HCIA初级认证是专为网络领域的新手与初学者设计的一项入门级认证。它旨在评估并确认个人对网络基本原理和技术知识的扎实掌握&#xff0c;是步入华为认证体系大门的基石。 一、华为HCIA 初级认证概述 华为初级认证网络工程师&am…

为OneAPI配置MySQL数据库及设置开机启动

OneAPI启动时&#xff0c;如果发现没有数据库他会在项目根目录自动创建SqlLit&#xff0c;为提高OneAPI的性能及管理&#xff0c;这里给出一个使用MySQL数据库的案例&#xff0c;同时本文介绍如何在源码部署的情况下&#xff0c;设置OneAPI的开机自动启动。 OneAPI的源代码安装…

【Qt】实现顶部导航栏自适应滑动效果

需求&#xff1a; 顶部导航栏有若干选项&#xff0c;可能很多&#xff0c;顶部区域不能完全展示&#xff0c;比如10个选项&#xff0c;界面一次只能展示五个&#xff0c;那么要求把后面的选项隐藏起来&#xff0c;并且&#xff0c;当点击第四个第五个按钮的时候&#xff0c;自…

Android Studio 加载多个FLutter项目

按顺序操作即可 选择工程 选择Modules, 导入 module 选中创建module 选择要导入的目录&#xff0c;只选择主目录&#xff0c;下面的文件不要选 添加完成&#xff0c;点击ok后&#xff0c;会进行导入 最终导入成功

【rpg像素角色】俯视角-行走动画

制作像素角色的俯视角行走动画并不像看上去那么复杂&#xff0c;尤其是在你已经完成了角色的4个方向站立姿势之后&#xff08;其中左右方向可以通过水平翻转实现&#xff09;。接下来&#xff0c;我会一步步为你讲解如何制作行走动画。 1. 理解行走规律 在制作行走动画之前&am…

堆排序

一&#xff1a;思想 堆排序(Heapsort)是指利用 堆 这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是通过堆来进行选择数据。 动图&#xff1a; 二&#xff1a;实现思路 假设&#xff1a;现在对一个7个整形的数组进行升序堆排&#xff08;2 1 5 7 4 3 …

基于 CycleGAN 对抗网络的自定义数据集训练

目录 生成对抗网络&#xff08;GAN&#xff09; CycleGAN模型训练 训练数据生成 下载开源项目CycleGAN 配置训练环境 开始训练 模型测试 可视化结果 生成对抗网络&#xff08;GAN&#xff09; 首先介绍一下什么是GAN网络&#xff0c;它是由生成器&#xff08;Generator…

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 注意 1.每一关没有固定的…

Modbus协议02:存储区简介

视频链接&#xff1a;【2】Modbus协议存储区说明_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11G4y1W7pU?p2&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.为什么需要存储区、存储区类型及代号 2.Modbus存储区范围及地址模型

SLM561A​​系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …

在Webmin上默认状态无法正常显示 Mariadb V11.02及以上版本

OS: Armbian OS 24.5.0 Bookworm Mariadb V11.02及以上版本 Webmin&#xff1a;V2.202 非常小众的问题&#xff0c;主要是记录一下。 如题 Webmin 默认无法正常显示 Mariadb V11.02及以上版本 如果对 /etc/webmin/mysql/config 文件作相应调整就可以再现Mariadb管理界面。 路径…

AI prompt(提示词)

# 好用的用于学习的AI提示词 ## 费曼学习法 请使用费曼学习法&#xff0c;用简单的语言解释&#xff08;量子力学&#xff09;是什么&#xff0c;并提供一个简单的例子来说明它如何应用 ## 帕累托法则&#xff08;80/20原则&#xff09; 将&#xff08;量子力学&#xff09;最…

09_Tensorflow2图像处理大赏:让你的图片笑出AI感,惊艳朋友圈!

1. 图像处理案例 1.1 逆时针旋转90度 import tensorflow as tf import matplotlib.pyplot as plt import matplotlib.cm as cm import numpy import osdef show_pic(pic,name,cmapNone):显示图像plt.imshow(pic,cmapcmap) plt.axis(off) # 打开坐标轴为 on # 设置图像标题…

【C++】认识C++(前言)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、本节概述 二、什么是C 三、C发展史 四…