欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在WPF中實(shí)現(xiàn)全局快捷鍵功能

 更新時(shí)間:2022年06月29日 10:45:07   作者:天方  
這篇文章介紹了在WPF中實(shí)現(xiàn)全局快捷鍵功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

今天寫一個(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)文章

  • C#開啟線程的四種示例

    C#開啟線程的四種示例

    這篇文章主要介紹了C#開啟線程的四種方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-10-10
  • C#算法之散列表

    C#算法之散列表

    本文詳細(xì)講解了C#算法之散列表,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C# 中的EventHandler實(shí)例詳解

    C# 中的EventHandler實(shí)例詳解

    本文通過案例實(shí)例介紹了c#中的eventhandler,需要的的朋友參考下吧
    2017-04-04
  • C#實(shí)現(xiàn)飛行棋項(xiàng)目

    C#實(shí)現(xiàn)飛行棋項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)飛行棋項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Unity實(shí)現(xiàn)顏色漸變滑動(dòng)條

    Unity實(shí)現(xiàn)顏色漸變滑動(dòng)條

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)顏色漸變滑動(dòng)條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C#.NET學(xué)習(xí)筆記5 C#中的條件編譯

    C#.NET學(xué)習(xí)筆記5 C#中的條件編譯

    條件編譯是C#比Java多出的東西,但我跟前輩請(qǐng)教后,他們都說條件編譯在實(shí)際的項(xiàng)目開發(fā)中不怎么使用.鑒于是新內(nèi)容,我還是做做筆記,理解一下好了
    2012-11-11
  • C#如何獲取枚舉的描述屬性詳解

    C#如何獲取枚舉的描述屬性詳解

    這篇文章主要給大家介紹了關(guān)于C#如何獲取枚舉的描述屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 基于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í)例

    這篇文章主要介紹了基于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
  • 如何利用反射構(gòu)建元數(shù)據(jù)查看器

    如何利用反射構(gòu)建元數(shù)據(jù)查看器

    本篇文章是對(duì)反射構(gòu)建元數(shù)據(jù)查看器進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • WPF實(shí)現(xiàn)2048小游戲

    WPF實(shí)現(xiàn)2048小游戲

    這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)2048小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評(píng)論