在WPF中实现全局快捷键功能

 更新时间:2022年06月29日 10:45:07   作者:天方  
这篇文章介绍了在WPF中实现全局快捷键功能的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

    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

        /// <summary>
        /// 注册快捷键
        /// </summary>
        /// <param name="window">持有快捷键窗口</param>
        /// <param name="fsModifiers">组合键</param>
        /// <param name="key">快捷键</param>
        /// <param name="callBack">回调函数</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">回调函数</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
    }

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

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函数中进行。

到此这篇关于在WPF中实现全局快捷键功能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C# wpf简单颜色板的实现

    C# wpf简单颜色板的实现

    wpf本身没有提供颜色板之类的控件,有些业务使用场景需要使用颜色板之类的控件,本文就简单实现,感兴趣的可以了解一下
    2021-10-10
  • 基于C#实现哈夫曼树算法

    基于C#实现哈夫曼树算法

    哈夫曼树又称最优二叉树,也就是带权路径最短的树,对于哈夫曼树,我想大家对它是非常的熟悉,使用下面我们就来学习一下如何通过C#实现哈夫曼树算法吧
    2023-11-11
  • C#常用的数据格式转换汇总

    C#常用的数据格式转换汇总

    这篇文章介绍了C#常用的数据格式转换,有需要的朋友可以参考一下
    2013-10-10
  • C#winform中数据库绑定DataGrid的实现

    C#winform中数据库绑定DataGrid的实现

    本文主要介绍了C#winform中数据库绑定DataGrid的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C#实现将HTML网页或HTML字符串转换为PDF

    C#实现将HTML网页或HTML字符串转换为PDF

    将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途,满足不同领域和情境下的需求,所以本文就来介绍一下如何使用C#实现将HTML网页或HTML字符串转换为PDF,有需要的可以参考下
    2024-01-01
  • 再谈异常处理try catch finally

    再谈异常处理try catch finally

    这篇文章主要介绍了再谈异常处理try catch finally 的相关资料,需要的朋友可以参考下
    2016-01-01
  • C#动态执行批处理命令的方法

    C#动态执行批处理命令的方法

    这篇文章主要介绍了C#动态执行批处理命令的方法,可实现动态执行一系列控制台命令,并允许实时显示出来执行结果,需要的朋友可以参考下
    2014-11-11
  • C#实现简易的加密、解密字符串工具类实例

    C#实现简易的加密、解密字符串工具类实例

    这篇文章主要介绍了C#实现简易的加密、解密字符串工具类,涉及C#字符串加密与加密的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • Windows窗体的.Net框架绘图技术实现方法

    Windows窗体的.Net框架绘图技术实现方法

    这篇文章主要介绍了Windows窗体的.Net框架绘图技术实现方法,非常实用,需要的朋友可以参考下
    2014-08-08
  • 详解C#之事件

    详解C#之事件

    这篇文章主要介绍了C#之事件的知识点,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以参考下
    2020-06-06

最新评论