zoukankan      html  css  js  c++  java
  • 动态为程序指定快捷键

    为了提供更加好的用户体验,在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);
    }

  • 相关阅读:
    leetcode回溯总结
    排序算法详解
    Java核心基础知识泛型
    leetcode贪心算法
    Linux虚拟机配置及安装Redis
    HJ6质数因子
    冒泡排序(升序)
    动态规划 背包问题
    配置mycatschema.xml
    HJ106字符逆序
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1268977.html
Copyright © 2011-2022 走看看