在c#中使用全局快捷键

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

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

代码如下:
 

在c#中使用全局快捷键_快捷键    static class Hotkey
在c#中使用全局快捷键_c#_02在c#中使用全局快捷键_句柄_03    
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_快捷键_05在c#中使用全局快捷键_句柄_06        
系统api#region 系统api
在c#中使用全局快捷键_封装_07        [DllImport(
"user32.dll")]
在c#中使用全局快捷键_封装_07        [
return: MarshalAs(UnmanagedType.Bool)]
在c#中使用全局快捷键_封装_07        
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);
在c#中使用全局快捷键_封装_07
在c#中使用全局快捷键_封装_07        [DllImport(
"user32.dll")]
在c#中使用全局快捷键_封装_07        
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
在c#中使用全局快捷键_快捷键_13        
#endregion

在c#中使用全局快捷键_封装_07
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05        
/**//// <summary> 
在c#中使用全局快捷键_封装_07        
/// 注册快捷键 
在c#中使用全局快捷键_封装_07        
/// </summary> 
在c#中使用全局快捷键_封装_07        
/// <param name="hWnd">持有快捷键窗口的句柄</param> 
在c#中使用全局快捷键_封装_07        
/// <param name="fsModifiers">组合键</param> 
在c#中使用全局快捷键_封装_07        
/// <param name="vk">快捷键的虚拟键码</param> 
在c#中使用全局快捷键_快捷键_13        
/// <param name="callBack">回调函数</param> 

在c#中使用全局快捷键_封装_07        public static void Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05        
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07            
int id = keyid++;
在c#中使用全局快捷键_封装_07            
if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
在c#中使用全局快捷键_封装_07                
throw new Exception("regist hotkey fail.");
在c#中使用全局快捷键_封装_07            keymap[id] 
= callBack;
在c#中使用全局快捷键_快捷键_13        }

在c#中使用全局快捷键_封装_07
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05        
/**//// <summary> 
在c#中使用全局快捷键_封装_07        
/// 注销快捷键 
在c#中使用全局快捷键_封装_07        
/// </summary> 
在c#中使用全局快捷键_封装_07        
/// <param name="hWnd">持有快捷键窗口的句柄</param> 
在c#中使用全局快捷键_快捷键_13        
/// <param name="callBack">回调函数</param> 

在c#中使用全局快捷键_封装_07        public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05        
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07            
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05            
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07                
if (var.Value == callBack)
在c#中使用全局快捷键_封装_07                    UnregisterHotKey(hWnd, var.Key);
在c#中使用全局快捷键_快捷键_13            }

在c#中使用全局快捷键_快捷键_13        }

在c#中使用全局快捷键_封装_07
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05        
/**//// <summary> 
在c#中使用全局快捷键_封装_07        
/// 快捷键消息处理 
在c#中使用全局快捷键_快捷键_13        
/// </summary> 

在c#中使用全局快捷键_封装_07        public static void ProcessHotKey(System.Windows.Forms.Message m)
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05        
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07            
if (m.Msg == WM_HOTKEY)
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05            
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07                
int id = m.WParam.ToInt32();
在c#中使用全局快捷键_封装_07                HotKeyCallBackHanlder callback;
在c#中使用全局快捷键_封装_07                
if (keymap.TryGetValue(id, out callback))
在c#中使用全局快捷键_句柄_06在c#中使用全局快捷键_快捷键_05                
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07                    callback();
在c#中使用全局快捷键_快捷键_13                }

在c#中使用全局快捷键_快捷键_13            }

在c#中使用全局快捷键_快捷键_13        }

在c#中使用全局快捷键_封装_07
在c#中使用全局快捷键_封装_07        
const int WM_HOTKEY = 0x312;
在c#中使用全局快捷键_封装_07        
static int keyid = 10;
在c#中使用全局快捷键_封装_07        
static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();
在c#中使用全局快捷键_封装_07
在c#中使用全局快捷键_封装_07        
public delegate void HotKeyCallBackHanlder();
在c#中使用全局快捷键_句柄_80    }

在c#中使用全局快捷键_快捷键
在c#中使用全局快捷键_快捷键    
enum HotkeyModifiers
在c#中使用全局快捷键_c#_02在c#中使用全局快捷键_句柄_03    
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07        MOD_ALT 
= 0x1,
在c#中使用全局快捷键_封装_07        MOD_CONTROL 
= 0x2,
在c#中使用全局快捷键_封装_07        MOD_SHIFT 
= 0x4,
在c#中使用全局快捷键_封装_07        MOD_WIN 
= 0x8
在c#中使用全局快捷键_句柄_80    }

在c#中使用全局快捷键_快捷键

 

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

 

在c#中使用全局快捷键_快捷键        void Test()
在c#中使用全局快捷键_c#_02在c#中使用全局快捷键_句柄_03        
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07            MessageBox.Show(
"Test");
在c#中使用全局快捷键_句柄_80        }

在c#中使用全局快捷键_快捷键
在c#中使用全局快捷键_快捷键        
protected override void WndProc(ref Message m)
在c#中使用全局快捷键_c#_02在c#中使用全局快捷键_句柄_03        
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07            
base.WndProc(ref m);
在c#中使用全局快捷键_封装_07            Hotkey.ProcessHotKey(m);
在c#中使用全局快捷键_句柄_80        }

在c#中使用全局快捷键_快捷键
在c#中使用全局快捷键_快捷键        
private void button1_Click(object sender, EventArgs e)
在c#中使用全局快捷键_c#_02在c#中使用全局快捷键_句柄_03        
在c#中使用全局快捷键_快捷键_04{
在c#中使用全局快捷键_封装_07            Hotkey.UnRegist(
this.Handle, Test);
在c#中使用全局快捷键_句柄_80        }
 


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

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