在WPF中實(shí)現(xiàn)全局快捷鍵功能
今天寫一個(gè)小程序中使用到了全局快捷鍵,找到了我之前寫的文章在c#中使用全局快捷鍵翻了一下,發(fā)現(xiàn)它是WinForm版本的,而我現(xiàn)在大部分寫WPF程序了,便將其翻譯了為WPF版本的了。
static class Hotkey { #region 系統(tǒng)api [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, uint vk); [DllImport("user32.dll")] static extern bool UnregisterHotKey(IntPtr hWnd, int id); #endregion /// <summary> /// 注冊(cè)快捷鍵 /// </summary> /// <param name="window">持有快捷鍵窗口</param> /// <param name="fsModifiers">組合鍵</param> /// <param name="key">快捷鍵</param> /// <param name="callBack">回調(diào)函數(shù)</param> public static void Regist(Window window, HotkeyModifiers fsModifiers, Key key, HotKeyCallBackHanlder callBack) { var hwnd = new WindowInteropHelper(window).Handle; var _hwndSource = HwndSource.FromHwnd(hwnd); _hwndSource.AddHook(WndProc); int id = keyid++; var vk = KeyInterop.VirtualKeyFromKey(key); if (!RegisterHotKey(hwnd, id, fsModifiers, (uint)vk)) throw new Exception("regist hotkey fail."); keymap[id] = callBack; } /// <summary> /// 快捷鍵消息處理 /// </summary> static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_HOTKEY) { int id = wParam.ToInt32(); if (keymap.TryGetValue(id, out var callback)) { callback(); } } return IntPtr.Zero; } /// <summary> /// 注銷快捷鍵 /// </summary> /// <param name="hWnd">持有快捷鍵窗口的句柄</param> /// <param name="callBack">回調(diào)函數(shù)</param> public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack) { foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap) { if (var.Value == callBack) UnregisterHotKey(hWnd, var.Key); } } 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 }
代碼仍然差不多,使用的方式更加簡單一點(diǎn):
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(); }
需要注意的是,調(diào)用Hotkey.Regist
函數(shù)時(shí),需要窗口是分配了句柄的,因此建議在OnLoad
事件或OnSourceInitialized
函數(shù)中進(jìn)行。
到此這篇關(guān)于在WPF中實(shí)現(xiàn)全局快捷鍵功能的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity實(shí)現(xiàn)顏色漸變滑動(dòng)條
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)顏色漸變滑動(dòng)條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07基于WebClient實(shí)現(xiàn)Http協(xié)議的Post與Get對(duì)網(wǎng)站進(jìn)行模擬登陸和瀏覽實(shí)例
這篇文章主要介紹了基于WebClient實(shí)現(xiàn)Http協(xié)議的Post與Get對(duì)網(wǎng)站進(jìn)行模擬登陸和瀏覽的方法,以實(shí)例形式詳細(xì)分析了WebClient模擬POST與GET登陸與瀏覽的過程,對(duì)于C#項(xiàng)目開發(fā)來說具有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11