C#实现全局快捷键功能
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
在c#中使用全局快捷键
由于.net并没有提供快捷键的库,所以要使用该功能得通过api实现。
在winapi中,注册和注销全局快捷键分别是通过RegisterHotKey
和UnregisterHotKey
函数实现。在c#中直接使用该api显得不够简洁,这里我提供了一个友好点的封装。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | static class Hotkey { #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类
实现功能的封装,使用非常简单。下面为参考测试代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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); } |
到此这篇关于C#实现全局快捷键功能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
C#使用SqlSugarClient进行数据访问并实现了统一的批量依赖注入(示例代码)
M为 BaseDto 请用C# 给出一个案例,支持不同表对应不同的业务逻辑层,然后不同仓储实例,不同表的业务,都实现统一的批量依赖注入,下面通过示例给大家演示如何使用SqlSugarClient进行数据访问,并实现了统一的批量依赖注入,感兴趣的朋友跟随小编一起看看吧2024-05-05Unity基于ShaderLab实现光照系统(着色器代码实现小结)
这篇文章主要介绍了Unity基于ShaderLab实现光照系统,主要总结unity中shaderlab的着色器代码实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-01-01C#使用struct类型作为泛型Dictionary<TKey,TValue>的键
这篇文章介绍了C#使用struct类型作为泛型Dictionary<TKey,TValue>键值的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-08-08
最新评论