博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在WPF中使用全局快捷键
阅读量:5010 次
发布时间:2019-06-12

本文共 2833 字,大约阅读时间需要 9 分钟。

今天写一个小程序中使用到了全局快捷键,找到了我之前写的文章翻了一下,发现它是WinForm版本的,而我现在大部分写WPF程序了,便将其翻译了为WPF版本的了。 

1     static class Hotkey 2     { 3         #region 系统api 4         [DllImport("user32.dll")] 5         [return: MarshalAs(UnmanagedType.Bool)] 6         static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, uint vk); 7  8         [DllImport("user32.dll")] 9         static extern bool UnregisterHotKey(IntPtr hWnd, int id);10         #endregion11 12         /// 13         /// 注册快捷键14         /// 15         /// 持有快捷键窗口16         /// 组合键17         /// 快捷键18         /// 回调函数19         public static void Regist(Window window, HotkeyModifiers fsModifiers, Key key, HotKeyCallBackHanlder callBack)20         {21             var hwnd = new WindowInteropHelper(window).Handle;22             var _hwndSource = HwndSource.FromHwnd(hwnd);23             _hwndSource.AddHook(WndProc);24 25             int id = keyid++;26 27             var vk = KeyInterop.VirtualKeyFromKey(key);28             if (!RegisterHotKey(hwnd, id, fsModifiers, (uint)vk))29                 throw new Exception("regist hotkey fail.");30             keymap[id] = callBack;31         }32 33         ///  34         /// 快捷键消息处理 35         ///  36         static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)37         {38             if (msg == WM_HOTKEY)39             {40                 int id = wParam.ToInt32();41                 if (keymap.TryGetValue(id, out var callback))42                 {43                     callback();44                 }45             }46             return IntPtr.Zero;47         }48 49         ///  50         /// 注销快捷键 51         ///  52         /// 持有快捷键窗口的句柄 53         /// 回调函数 54         public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)55         {56             foreach (KeyValuePair
var in keymap)57 {58 if (var.Value == callBack)59 UnregisterHotKey(hWnd, var.Key);60 }61 }62 63 64 const int WM_HOTKEY = 0x312;65 static int keyid = 10;66 static Dictionary
keymap = new Dictionary
();67 68 public delegate void HotKeyCallBackHanlder();69 }70 71 enum HotkeyModifiers72 {73 MOD_ALT = 0x1,74 MOD_CONTROL = 0x2,75 MOD_SHIFT = 0x4,76 MOD_WIN = 0x877 }
View Code

 

代码仍然差不多,使用的方式更加简单一点:

protected override void OnSourceInitialized(EventArgs e)

{
    Hotkey.Regist(this, HotkeyModifiers.MOD_ALT, Key.T, () =>
    {
        MessageBox.Show("hello");
    });
    _context = new MainContext();
    this.DataContext = _context;
    _context.Process();
}

需要注意的是,调用Hotkey.Regist函数时,需要窗口是分配了句柄的,因此建议在OnLoad事件或OnSourceInitialized函数中进行。

 

转载于:https://www.cnblogs.com/TianFang/p/7668753.html

你可能感兴趣的文章
scss常规用法
查看>>
css定位position属性深究
查看>>
android中不同版本兼容包的区别
查看>>
Static 与 new 的问题【待解决】
查看>>
xml
查看>>
在 mvc4 WebApi 中 json 的 跨域访问
查看>>
敏捷开发文章读后感
查看>>
xposed获取context 的方法
查看>>
html5 canvas 图像处理
查看>>
He who hesitates is Lost
查看>>
php中引用&的真正理解-变量引用、函数引用、对象引用
查看>>
关于<form> autocomplete 属性
查看>>
OutOfMemory
查看>>
LeetCode:组合总数III【216】
查看>>
Thinkphp框架回顾(三)之怎么实现平常的sql操作数据库
查看>>
虚函数的效率问题
查看>>
POJ 1860 Currency Exchange(SPFA 判断有无“正”环)
查看>>
广告地址屏蔽
查看>>
收缩SqlServer数据库日记方法
查看>>
每日英语:15 places to find inspiration
查看>>