为了提供更加好的用户体验,在windows Forms开发中,通常我们需要让用户可以自定义快捷键。我们知道在设计阶段指派快捷键是很容易的,但是如何让他们可以在运行时动态指定快捷键呢?

第一步:导入两个函数,分别是注册和取消注册快捷键

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace TestHotKeys
{
    class HotKeys
    {
        //如果函数执行成功,返回值不为0。       
        //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。       
        [DllImport("user32.dll", SetLastError = true)]       
        public static extern bool RegisterHotKey(           
            IntPtr hWnd,                //要定义热键的窗口的句柄           
            int id,                     //定义热键ID(不能与其它ID重复)
            KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效           
            Keys vk                     //定义热键的内容  
            );

[DllImport("user32.dll", SetLastError = true)]       
        public static extern bool UnregisterHotKey(           
            IntPtr hWnd,                //要取消热键的窗口的句柄           
            int id                      //要取消热键的ID           
            );       
            //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)       
        [Flags()]       
        public enum KeyModifiers        {           
            None = 0,           
            Alt = 1,           
            Ctrl = 2,           
            Shift = 4,           
            WindowsKey = 8       
        }
    }
}

第二步:在窗体的初始化之后,注册快捷键

/// <summary>
/// 注册快捷键。这里的100,101,102是随便写的,只要不重复就可以
/// </summary>
private void RegisterHotKeys()
{
    HotKeys.RegisterHotKey(Handle, 100, HotKeys.KeyModifiers.Shift, Keys.A);
    HotKeys.RegisterHotKey(Handle, 101, HotKeys.KeyModifiers.Shift, Keys.B);
    HotKeys.RegisterHotKey(Handle, 102, HotKeys.KeyModifiers.Shift, Keys.C);
}

第三步:编写一个特殊事件,让窗体能接收windows消息

/// <summary>
/// 响应窗体消息的事件
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
    const int WM_HOTKEY = 0x0312;
    switch (m.Msg)
    {
        case WM_HOTKEY: {
            switch (m.WParam.ToInt32())
            {
                case 100: { CallMethod("A"); break; }
                case 101: { CallMethod("B"); break; }
                case 102: { CallMethod("C"); break; }
                default:
                    break;
            }
            break;
        }
        default:
            break;
    }
    base.WndProc(ref m);
}

我们这里是为了演示目的,实现了一个简单的CallMethod方法,它就是显示一个消息而已

private void CallMethod(string input) {
    MessageBox.Show(input);
}

最后,不要忘记在窗体关闭的时候,取消快捷键的注册

/// <summary>
/// 取消快捷键注册
/// </summary>
private void UnRegisterHotKeys()
{
    HotKeys.UnregisterHotKey(Handle, 100);
    HotKeys.UnregisterHotKey(Handle, 101);
    HotKeys.UnregisterHotKey(Handle, 102);
}

动态为程序指定快捷键相关推荐

  1. 扫码普通二维码跳转微信小程序指定页面(体验服和开发服跳转链接不能动态传参)

    好久不见,时隔多年我又来记录问题来了,记录这次问题的主要原因是减少你我去搜索资源的时间,下面开始讲讲我越到的问题.(下面说的是针对小程序体验版或者开发版哈,正式环境不存在这个问题) 需求:pc端扫码登 ...

  2. uni-app微信小程序生成自定义参数二维码,跳转小程序指定页面,获取参数;uni-app微信小程序获取二维码自定义参数;微信小程序生成动态参数二维码;uni-app微信小程序获取动态参数二维码;

    一.场景需求: 在小程序个人名片页面A页面,生成用户的个人名片二维码(该二维码携带用户的唯一标识id):微信扫一扫或长按图片识别这个二维码,可以跳转到小程序的B页面,并且在B页面拿到二维码上的唯一标识 ...

  3. 应用程序自定义快捷键

    版权声明:本文首发 http://asing1elife.com ,转载请注明出处. https://blog.csdn.net/asing1elife/article/details/8282065 ...

  4. 给黑莓程序添加快捷键

    在集成开发环境中打开资源页,在Title属性中,开发者一般会在这里指定应用程序的名字.在名字中挑一个字母,然后在后面加上\u0332,这个字母就成了该应用程序的快捷键. 如果系统原来对这个字母定义了快 ...

  5. 小程序扫描普通链接二维码跳转小程序指定界面方法

    微信官方文档扫普通链接二维码打开小程序 | 微信开放文档 看了官方文档之后,还是存在很多困惑,微信小程序是托管到微信服务器上的,要想扫描普通链接跳转指定界面,首先要知道微信把小程序放的服务器的访问路径 ...

  6. 28项全能版动态寄生虫程序-烟雨开发动态寄生虫安装控制面板-2022动态寄生虫程序-全网独家

    28项全能版动态寄生虫程序-烟雨开发动态寄生虫安装控制面板-2022动态寄生虫程序-全网独家 动态寄生虫全自动采集伪原创7种新闻源,全自动统计轮链,多种后缀随机展示,关键词文章全局转码,文章随机内链. ...

  7. 该按钮可以重启计算机,win7指定快捷键和重启快捷键是什么

    篇一:Windows7的关机快捷键和重启快捷键 Windows7的关机快捷键和重启快捷键是什么? 这个问题在软媒论坛里面问的还真比较多,早期操作系统如XP的关机快捷键是"Win键 U U&q ...

  8. ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践

    编辑:小君君 技术校对:星空下的文仔.bot 在 Kubernetes 中,ConfigMap 是允许管理员将配置组件与镜像内容解耦,使容器化应用程序产生可移植性的一种资源.ConfigMap 可以与 ...

  9. vue利用 vue-animate-number插件动态展示数字(从0动态滚动到指定数字)

    vue利用 vue-animate-number插件动态展示数字(从0动态滚动到指定数字) 第一步:安装vue-animate-number插件 $ npm install vue-animate-n ...

最新文章

  1. 全排列算法的字典序排列
  2. node和npm版本更新
  3. Ilya Muromets(DP or 思维)
  4. 食堂外卖java源代码,基于jsp的饭堂外卖系统-JavaEE实现饭堂外卖系统 - java项目源码...
  5. C++_类和对象_对象特性_构造函数的分类以及调用---C++语言工作笔记041
  6. Thymeleaf前后端传值 页面取值与js取值
  7. 国产数据库助力民航核心交易系统
  8. HTTP Keep-Alive详解[转]
  9. rtlab matlab版本,电力电子技术教学中电力仿真软件选择与应用.doc
  10. 腾讯云短信服务详细教程
  11. hover和active的区别
  12. 标准的服务端返回Result封装及使用
  13. 科技大佬对人工智能的看法
  14. Mysql ESCAPE 用法
  15. Android版本与Linux内核版本的关系
  16. 米开朗基罗在他的画里,可是暗藏了不少'男男kiss'的镜头,要不要来了解下?
  17. 利用内容营销来推动长尾词SEO优化
  18. 05.视频播放器内核切换封装
  19. 魔方cfop公式软件_【入门】误区与方法篇(三阶魔方)
  20. uniapp点击时出现背景声音

热门文章

  1. Android 应用 之路 MPAndroidChart~ScatterChart
  2. websocket python爬虫_python实现基于websocket协议的网络爬虫
  3. python简单爬虫程序分析_[Python专题学习]-python开发简单爬虫
  4. Python matplotlib中文显示异常,导入simhei字体有误
  5. Mysql —— linux下使用c语言访问mySql数据库
  6. Spring源码窥探之:xxxAware接口
  7. LeetCode(30):与所有单词相关联的字串
  8. bzoj3993 [SDOI2015]星际战争
  9. POJ3272 Cow Traffic
  10. 晒加班晒熬夜……“晒勤奋”是一种病!