封装的全局热键

ExpandedBlockStart.gif 代码
     ///   <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  !=   null this .HotkeyDown( this , e);
        }
    }

 

转载于:https://www.cnblogs.com/sofire/archive/2010/06/25/1764988.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值