【筆記】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("快捷鍵被調用!");
        }
    }

注意,這里需要重載窗口處理函數,當快捷鍵信息傳到到窗口時,需要對相應的信息進行處理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM