• 【笔记】C#注册和注销全局快捷键


    在使用酷狗听歌的时候,我们可以不打开酷狗程序,直接使用组合键(Ctrl + Alt + 上)增加音量,使用(Ctrl + Alt + 右)切换到下一曲

    如何在C#代码中实现这样全局快捷键呢

    C#.NET没有提供现成的API,我们通过引用系统的API进行注册

    1、首先,创建一个快捷键操作的类,可以完成注册,注销的操作,具体说明看注释

        public class HotKeys
        {
            //引入系统API
            [DllImport("user32.dll")]
            static extern bool RegisterHotKey(IntPtr hWnd, int id, int modifiers, Keys vk);
            [DllImport("user32.dll")]
            static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
    
            int keyid = 10;     //区分不同的快捷键
            Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();   //每一个key对于一个处理函数
            public delegate void HotKeyCallBackHanlder();
            
            //组合控制键
            public enum HotkeyModifiers
            {
                Alt = 1,
                Control = 2,
                Shift = 4,
                Win = 8
            }
            
            //注册快捷键
            public void Regist(IntPtr hWnd, int modifiers, Keys vk, HotKeyCallBackHanlder callBack)
            {
                int id = keyid++;
                if (!RegisterHotKey(hWnd, id, modifiers, vk))
                    throw new Exception("注册失败!");
                keymap[id] = callBack;
            }
            
            // 注销快捷键
            public void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
            {
                foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
                {
                    if (var.Value == callBack)
                    {
                        UnregisterHotKey(hWnd, var.Key);
                        return;
                    }
                }
            }
            
            // 快捷键消息处理
            public void ProcessHotKey(Message m)
            {
                if (m.Msg == 0x312)
                {
                    int id = m.WParam.ToInt32();
                    HotKeyCallBackHanlder callback;
                    if (keymap.TryGetValue(id, out callback))
                        callback();
                }
            }
        }

    可以从代码看出,如何快捷键是如何进行注册的,需要得到窗口句柄控制键(Ctrl,Alt,Win等),快捷键(E),回调函数,快捷键的注册是不保存的,当程序关闭后重新打开时,需要重新注册快捷键

    2、接下来是使用 HotKeys 类 进行快捷键注册和注销

        public partial class Form1 : Form
        {
            HotKeys h = new HotKeys();
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnRegist_Click(object sender, EventArgs e)
            {
                //这里注册了Ctrl+Alt+E 快捷键
                h.Regist(this.Handle, (int)HotKeys.HotkeyModifiers.Control + (int)HotKeys.HotkeyModifiers.Alt, Keys.E, CallBack);
                MessageBox.Show("注册成功");
            }
    
            private void btnUnregist_Click(object sender, EventArgs e)
            {
                h.UnRegist(this.Handle, CallBack);
                MessageBox.Show("卸载成功");
            }
    
            protected override void WndProc(ref Message m)
            {
                //窗口消息处理函数
                h.ProcessHotKey(m);
                base.WndProc(ref m);
            }
    
            //按下快捷键时被调用的方法
            public void CallBack()
            {
                MessageBox.Show("快捷键被调用!");
            }
        }

    注意,这里需要重载窗口处理函数,当快捷键信息传到到窗口时,需要对相应的信息进行处理

  • 相关阅读:
    夺命雷公狗---DEDECMS----21dedecms按照地区取出电影内容
    夺命雷公狗---DEDECMS----20dedecms取出栏目页对应的内容
    夺命雷公狗---DEDECMS----19dedecms栏目列表页的完成
    夺命雷公狗---DEDECMS----18dedecms之无可奈何标签-sql标签取出今天更新
    mysql取出现在的时间戳和时间时间戳转成人类看得懂的时间
    SQL语句:find_in_set的使用方法
    夺命雷公狗---DEDECMS----17dedecms头条信息的取出
    夺命雷公狗---DEDECMS----16dedecms取出首页今日更新
    夺命雷公狗---DEDECMS----15dedecms首页栏目列表页导航部分完成
    夺命雷公狗---DEDECMS----14dedecms首页导航条的完成
  • 原文地址:https://www.cnblogs.com/bomo/p/2809981.html
Copyright © 2020-2023  润新知