using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Input; using System.Windows.Interop; namespace Ink_Canvas { static class Hotkey { #region 系统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 /// /// 注册快捷键 /// /// 持有快捷键窗口 /// 组合键 /// 快捷键 /// 回调函数 public static bool Regist(Window window, HotkeyModifiers fsModifiers, Key key, HotKeyCallBackHanlder callBack) { var hwnd = new WindowInteropHelper(window).Handle; var _hwndSource = HwndSource.FromHwnd(hwnd); if (keyid == 10) { _hwndSource.AddHook(WndProc); } int id = keyid++; var vk = KeyInterop.VirtualKeyFromKey(key); if (!RegisterHotKey(hwnd, id, fsModifiers, (uint)vk)) { //throw new Exception("regist hotkey fail."); return false; } keymap[id] = callBack; return true; } /// /// 快捷键消息处理 /// 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; } /// /// 注销快捷键 /// /// 持有快捷键窗口的句柄 /// 回调函数 public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack) { foreach (KeyValuePair var in keymap) { if (var.Value == callBack) UnregisterHotKey(hWnd, var.Key); } } const int WM_HOTKEY = 0x312; static int keyid = 10; static Dictionary keymap = new Dictionary(); public delegate void HotKeyCallBackHanlder(); } enum HotkeyModifiers { MOD_ALT = 0x1, MOD_CONTROL = 0x2, MOD_SHIFT = 0x4, MOD_WIN = 0x8 } }