首页后端开发其他后端知识WPF里如何实现全局快捷键?具体方法是什么?

WPF里如何实现全局快捷键?具体方法是什么?

时间2024-03-24 04:22:03发布访客分类其他后端知识浏览1417
导读:在这篇文章中我们将学习“WPF里如何实现全局快捷键?具体方法是什么?”的相关知识,下文有详细的介绍及实例,步骤过程清晰,简单易懂,小编觉得挺不错的,有需要的朋友可以借鉴参考,希望大家阅读完这篇能有所获。 今天写一个小程序中使用到了全局快...
在这篇文章中我们将学习“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 (KeyValuePairint, HotKeyCallBackHanlder>
 var in keymap)
            {
    
                if (var.Value == callBack)
                    UnregisterHotKey(hWnd, var.Key);

            }

        }
    


        const int WM_HOTKEY = 0x312;
    
        static int keyid = 10;
    
        static Dictionaryint, HotKeyCallBackHanlder>
     keymap = new Dictionaryint, 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();

}
    



以上就是关于WPF里如何实现全局快捷键?具体方法是什么?的介绍啦,需要的朋友可以参考上述内容,希望对大家有帮助,想要了解更多,欢迎关注网络,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: WPF里如何实现全局快捷键?具体方法是什么?
本文地址: https://pptw.com/jishu/651816.html
怎么求数组中奇数的和。php有什么方法 MySQL索引用B+树结构的优势在哪?

游客 回复需填写必要信息