封装的全局热键

代码
    /// <summary> 概述:表示按下全局热键后发生的事件参数。
    
/// </summary>
    public class HotkeyEventArgs : EventArgs
    {
        
private int _keysID;
        
/// <summary> 概述:唯一的全局热键编号。
        
/// </summary>
        public int KeysID { get { return this._keysID; } }
        
private Keys _keys;
        
/// <summary> 概述:注册的全局热键。
        
/// </summary>
        public Keys Keys { get { return this._keys; } }

        
/// <summary> 概述:初始化 System.Windows.Forms.Hotkey 类的新实例。
        
/// </summary>
        
/// <param name="keysID">唯一的全局热键编号。</param>
        
/// <param name="keys">注册的全局热键。</param>
        public HotkeyEventArgs(int keysID, Keys keys)
        {
            
this._keysID = keysID;
            
this._keys = keys;
        }
    }

    
/// <summary> 概述:表示按下全局热键后发生的事件委托。
    
/// </summary>
    public delegate void HotkeyDownEventHandler(object sender, HotkeyEventArgs e);

    
/// <summary> 概述:表示注册、注销全局热键的封装。
    
/// </summary>
    public class Hotkey : IMessageFilter
    {
        
/// <summary> 概述:窗体句柄。
        
/// </summary>
        IntPtr _hWnd;
        Dictionary
<Keys, int> _keyList = new Dictionary<Keys, int>(11);

        [DllImport(
"user32.dll")]
        
static extern int RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
        [DllImport(
"user32.dll")]
        
static extern int UnregisterHotKey(IntPtr hWnd, int id);
        [DllImport(
"kernel32.dll")]
        
static extern int GlobalAddAtom(String lpString);
        [DllImport(
"kernel32.dll")]
        
static extern int GlobalDeleteAtom(int nAtom);

        
/// <summary> 概述:初始化 System.Windows.Forms.Hotkey 类的新实例。
        
/// </summary>
        
/// <param name="hWnd">窗口句柄。</param>
        public Hotkey(IntPtr hWnd)
        {
            
this._hWnd = hWnd;
            Application.AddMessageFilter(
this);
        }

        [Flags]
        
private enum HotkeyModifiers
        {
            None 
= 0,
            Alt 
= 1,
            Control 
= 2,
            Shift 
= 4,
            Windows 
= 8
        }

        
/// <summary> 概述:注册一个全局热键。
        
/// </summary>
        
/// <param name="keys">键。</param>
        public int RegisterHotkey(Keys keys)
        {
            
int hotkeyid = GlobalAddAtom(Guid.NewGuid().ToString());
            
this._keyList.Add(keys, hotkeyid);

            HotkeyModifiers modifiers 
= HotkeyModifiers.None;
            
if ((keys & Keys.Control) == Keys.Control)
            {
                modifiers 
|= HotkeyModifiers.Control;
                keys 
= keys & ~Keys.Control;
            }
            
if ((keys & Keys.Alt) == Keys.Alt)
            {
                modifiers 
|= HotkeyModifiers.Alt;
                keys 
= keys & ~Keys.Alt;
            }
            
if ((keys & Keys.Shift) == Keys.Shift)
            {
                modifiers 
|= HotkeyModifiers.Shift;
                keys 
= keys & ~Keys.Shift;
            }
            
if ((keys & Keys.LWin) == Keys.LWin)
            {
                modifiers 
|= HotkeyModifiers.Windows;
                keys 
= keys & ~Keys.LWin;
            }


            RegisterHotKey(_hWnd, hotkeyid, (
int)modifiers, (int)keys);
            
return hotkeyid;
        }

        
/// <summary> 概述:注销一个全局热键。
        
/// </summary>
        
/// <param name="keys">键。</param>
        public void UnregisterHotkeys(Keys key)
        {
            
if (this._keyList.ContainsKey(key))
            {
                
int keyid = this._keyList[key];
                UnregisterHotKey(_hWnd, keyid);
                GlobalDeleteAtom(keyid);
                
this._keyList.Remove(key);
            }
        }

        
/// <summary> 概述:注销所有的全局热键。
        
/// </summary>
        public void UnregisterHotkeys()
        {
            Application.RemoveMessageFilter(
this);
            
foreach (int key in this._keyList.Keys)
            {
                UnregisterHotKey(_hWnd, key);
                GlobalDeleteAtom(key);
            }
            
this._keyList.Clear();
        }

        
/// <summary> 概述:在调度消息之前将其筛选出来
        
/// </summary>
        
/// <param name="m">要调度的消息。无法修改此消息。</param>
        public bool PreFilterMessage(ref Message m)
        {
            
if (m.Msg == 0x312/*WM_HOTKEY*/
            {
                
int keyID = (int)m.WParam;

                
foreach (var item in this._keyList)
                {
                    
if (item.Value == keyID)
                    {
                        
this.OnHotkeyDown(new HotkeyEventArgs(keyID, item.Key));
                        
break;
                    }
                }
            }
            
return false;
        }

        
/// <summary> 概述:按下全局热键后发生。
        
/// </summary>
        public event HotkeyDownEventHandler HotkeyDown;

        
/// <summary> 概述:引发 System.Windows.Forms.Hotkey.HotkeyDown 事件。
        
/// </summary>
        
/// <param name="e">参数。</param>
        protected virtual void OnHotkeyDown(HotkeyEventArgs e)
        {
            
if (this.HotkeyDown != nullthis.HotkeyDown(this, e);
        }
    }
原文地址:https://www.cnblogs.com/sofire/p/1764988.html