zoukankan      html  css  js  c++  java
  • 封装的全局热键

    代码
        /// <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);
            }
        }
  • 相关阅读:
    Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP)
    你有一份新的C++书单,请注意查收!
    想了解大数据的鼻祖Hadoop技术栈,这里有一份优质书单推荐!
    程序员的健康问题终于有救了,有个资深程序员写了本《程序员健康指南》!
    《程序员如何优雅地挣零花钱》电子书免费开源!!!
    学习设计模式,你需要这样一份书单!
    《自拍教程36》段位三 Python面向对象类
    《自拍教程35》段位二 Python面向过程函数
    《自拍教程34》段位一 Python批处理脚本
    《自拍教程33》案例篇 内容介绍
  • 原文地址:https://www.cnblogs.com/sofire/p/1764988.html
Copyright © 2011-2022 走看看