在c#中使用全局快捷键

在c#中使用全局快捷键

由于.net并没有提供快捷键的库,所以要使用该功能得通过api实现。

在winapi中,注册和注销全局快捷键分别是通过RegisterHotKeyUnregisterHotKey函数实现。在c#中直接使用该api显得不够简洁,这里我提供了一个友好点的封装。

代码如下:
 

     static   class  Hotkey
    
{
        
系统api#region 系统api
        [DllImport(
"user32.dll")]
        [
return: MarshalAs(UnmanagedType.Bool)]
        
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);

        [DllImport(
"user32.dll")]
        
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
        
#endregion


        
/**//// <summary> 
        
/// 注册快捷键 
        
/// </summary> 
        
/// <param name="hWnd">持有快捷键窗口的句柄</param> 
        
/// <param name="fsModifiers">组合键</param> 
        
/// <param name="vk">快捷键的虚拟键码</param> 
        
/// <param name="callBack">回调函数</param> 

        public static void Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
        
{
            
int id = keyid++;
            
if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
                
throw new Exception("regist hotkey fail.");
            keymap[id] 
= callBack;
        }


        
/**//// <summary> 
        
/// 注销快捷键 
        
/// </summary> 
        
/// <param name="hWnd">持有快捷键窗口的句柄</param> 
        
/// <param name="callBack">回调函数</param> 

        public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
        
{
            
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
            
{
                
if (var.Value == callBack)
                    UnregisterHotKey(hWnd, var.Key);
            }

        }


        
/**//// <summary> 
        
/// 快捷键消息处理 
        
/// </summary> 

        public static void ProcessHotKey(System.Windows.Forms.Message m)
        
{
            
if (m.Msg == WM_HOTKEY)
            
{
                
int id = m.WParam.ToInt32();
                HotKeyCallBackHanlder callback;
                
if (keymap.TryGetValue(id, out callback))
                
{
                    callback();
                }

            }

        }


        
const int WM_HOTKEY = 0x312;
        
static int keyid = 10;
        
static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();

        
public delegate void HotKeyCallBackHanlder();
    }


    
enum  HotkeyModifiers
    
{
        MOD_ALT 
= 0x1,
        MOD_CONTROL 
= 0x2,
        MOD_SHIFT 
= 0x4,
        MOD_WIN 
= 0x8
    }

 

这里通过Hotkey类实现功能的封装,使用非常简单。下面为参考测试代码。

 

         void  Test()
        
{
            MessageBox.Show(
"Test");
        }


        
protected   override   void  WndProc( ref  Message m)
        
{
            
base.WndProc(ref m);
            Hotkey.ProcessHotKey(m);
        }


        
private   void  button1_Click( object  sender, EventArgs e)
        
{
            Hotkey.UnRegist(
this.Handle, Test);
        }
 


当程序form1启动时,注册了两个快捷键Alt+TCtrl+Shift+K,单击button1的时候会注销快捷键Alt+T。代码比较简单,这里就不多介绍了。

注:快捷键是通过消息触发的,因此要重载WndProc函数,在里面添加对快捷键回调消息的处理方法Hotkey.ProcessHotKey(m)

 

转载于:https://www.cnblogs.com/TianFang/archive/2007/05/14/745489.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值